11 votes

Pourquoi la mémoire perdue semble être malloquée dans kernel_task, et pourquoi OS X ne peut pas la ramasser à la poubelle

On m'a déjà dit qu'un signe qu'une application a une fuite de mémoire est que kernel_task a une grande empreinte mémoire, généralement de l'ordre du gigaoctet. Si une erreur kext était à l'origine de cette utilisation de la mémoire, nous nous attendrions à voir un écart entre la mémoire allouée et celle qui devrait l'être, c'est à dire

diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6) 

retournerait autre chose que les mots 'Wired' et 'Name'.

Au cours de la rédaction de ma thèse, j'ai remarqué que la modification d'un pdf alors qu'il est ouvert dans Preview provoque souvent de mauvaises choses : parfois, l'utilisation de la mémoire de l'ordinateur est réduite. kernel_task peut atteindre environ huit gigaoctets, voire plus. Si je tue l'aperçu, il revient à la normale, instantanément. . Donc, de toute évidence, quelque chose ne va pas - et Preview fait fuir la mémoire dans ces conditions.

Donc, ma question est la suivante : si I savoir qu'un processus a laissé échapper du bélier via une augmentation soudaine et inattendue de l'empreinte de kernel_task pourquoi on ne peut pas OS X savoir que quelque chose a mal tourné. Si tuer Preview restaure ma disparition malloc() la mémoire, pourquoi n'a pas Darwin fait la collecte des déchets automatiquement pour moi ?

Ai-je une mauvaise compréhension fondamentale du fonctionnement de la gestion de la mémoire ?

EDIT : (15/9/15)

Voici une démonstration de ce dont je parle. Tout d'abord, je remarque une utilisation élevée de la mémoire par kernel_task (notez que l'aperçu est ouvert, juste visible en bas du moniteur d'activité, utilisant 333 Mio de RAM) :

High kernel memory usage

En suivant les remarques utiles d'Ashley ci-dessous, découvrons combien chaque kext utilise :

$ kextstat | awk 'NR==1{ printf "%10s %s\n", $5, $6; } NR!=1{ printf "%10d %s\n", $5, $6; }' | sort -n

...
...
...
   1249280 com.apple.driver.DspFuncLib
   1769472 com.apple.nvidia.driver.NVDAGK100Hal
   2629632 com.apple.nvidia.driver.NVDAResman
   6184960 com.apple.driver.AirPort.Brcm4360
$

Donc, pas un montant énorme. Ma machine est équipée de GPU discrets et intégrés ; leurs pilotes n'utilisent que quelques MiB de RAM câblée. Selon mon intuition, supprimons Preview et regardons ce qui se passe au niveau de l'empreinte mémoire des éléments suivants kernel_task :

Killing preview helps things

L'aperçu a disparu, et l'empreinte mémoire du noyau a considérablement diminué. Il n'y a toujours aucune preuve d'un changement dans l'utilisation de kext : la sortie de la commande ci-dessus est inchangée.

Modifier : Bug signalé sous le n° 22701036. J'attends toujours une réponse d'apple. Il n'y a rien de particulièrement intéressant si vous inspectez le processus dans ActivityMonitor, mais peut-être que je rate quelque chose.

6voto

Graham Miln Points 39606

El cœur de l'OS X ne fait pas l'objet d'un ramassage des déchets ; la méthode IOKit libkern C++ Runtime exige des développeurs qu'ils gèrent leur propre mémoire.

Gestion de la mémoire sur Mac

De Comment fonctionne la gestion de la mémoire dans Mac OS X ?

Apple documente les niveaux les plus bas de la Noyau de Mach et le sous-système de mémoire virtuelle assez bien sur le web dans le cadre de sa documentation pour les développeurs.

Depuis que ce noyau a été développé par l'université Carnegie Mellon vous pouvez trouver des dizaines de documents le décrivant assez facilement.

Autres sources

Collecte des ordures

La collecte des déchets se fait au niveau de l'utilisateur ou de l'application. Même au niveau de cette couche, le ramassage des déchets n'est utile que si l'application a libéré tous les droits sur la mémoire. Une dépendance circulaire peut faire échouer le ramassage des déchets. Le ramassage des déchets est un domaine de recherche en constante évolution. difficile à obtenir .

Signaler les bogues et les fuites de mémoire

Les bogues dans OS X feront fuir la mémoire. Étant donné la taille de la base de code, c'est presque certain.

S'il vous plaît signaler les bogues reproductibles directement à Apple . Chaque rapport de bogue est utile et peut-être que votre exemple sera celui qui aidera les ingénieurs d'Apple à déterminer la cause du problème.

4voto

Ashley Points 4027

Voici ce que je pense, en supposant que votre Mac dispose d'un GPU intégré (par exemple Intel Iris Graphics).

Lorsque vous avez votre thèse ouverte dans Aperçu, la mémoire de la carte graphique est utilisée pour contenir l'image ("texture") de la fenêtre d'Aperçu, et peut-être aussi quelques pages hors écran mais décodées de la thèse.

Avec une carte graphique intégrée, la mémoire vidéo est en fait (partiellement ?) située dans la RAM du système, qui est partagée entre le CPU et le GPU. Sur certaines cartes graphiques intégrées, la quantité de RAM système utilisée est allouée de manière dynamique (cf. Apple HT204349 ).

Je suppose que vous rencontrez par intermittence un bug dans le pilote de la carte graphique et/ou dans Preview, qui ne libère pas correctement la mémoire système lorsque Preview recharge votre PDF de thèse. (Cependant, ce bogue est atténué par OS X / le pilote libère correctement la mémoire lorsque Preview se termine).

Vous pouvez essayer de regarder la sortie de kextstat et voir si les chiffres dans le Size augmentation de la colonne lorsque vous rencontrez le problème. Ma théorie est que l'augmentation de 8 Go que vous mentionnez est due au pilote de la carte graphique.

La commande suivante (tirée d'un commentaire sur cette réponse connexe et intéressante ) trie la sortie de kextstat pour faciliter l'identification du kext qui utilise le plus de mémoire (notez toutefois que ce tri est effectué en fonction de la valeur de l'attribut de l'utilisateur). Wired colonne... il y a une incantation similaire, plus simple, en cette réponse avec une explication si vous souhaitez modifier cela).

kextstat | awk 'NR==1{ printf "%10s %s\n", $5, $6; } NR!=1{ printf "%10d %s\n", $5, $6; }' | sort -n

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X