2010-11-19 8 views
4

Un administrateur système a indiqué à med que les fuites de mémoire peuvent être invisibles. c'est-à-dire que toute la mémoire utilisée par une application peut ne pas être visible dans le gestionnaire de tâches ou dans un outil équivalent si l'application perd de la mémoire.Fuite de mémoire cachée

Il semblait très sûr de cela. J'ai toujours pensé que toutes les fuites de mémoire sont affichées correctement (pas en octets, mais que la mémoire augmente constamment jusqu'à ce qu'il n'y ait plus de mémoire dans le serveur) dans des outils comme le gestionnaire de tâches (ou l'explorateur de processus)?

Est-ce que sa déclaration est correcte, et si oui: Quels types de programmes peuvent fuir la mémoire de cette façon?

Modifier:

Je ne parle pas de voir une fuite spécifique, mais que le processus consomme de plus en plus de mémoire. Selon lui, le processus ne consommera plus de mémoire pour certaines fuites de mémoire.

Répondre

4

Une fuite de mémoire est une situation où un bloc de mémoire est marquée comme occupée existe dans la mémoire du programme et il n'y a pas de variable pointeur dans le programme stocker l'adresse si ce bloc. Le Gestionnaire des tâches et les utilitaires similaires affichent le volume total de la mémoire occupée (plus les frais généraux, plus la fragmentation) et ils n'ont aucune idée des pointeurs - ils ne peuvent pas inspecter la mémoire du programme.

C'est pourquoi la mémoire de fuite et la mémoire juste occupée par le programme stocke les pointeurs est indiscernable pour ces utilitaires. La fuite de la mémoire "silencieusement" - de manière cachée, de sorte que la consommation de mémoire du programme n'augmente pas - est impossible.

+1

Vous pouvez utiliser un outil pour trouver des fuites de mémoire - disjoncteur. Cool application! – MastAvalons

+0

J'ai oublié +1 lorsque j'ai accepté la réponse. Vous l'avez maintenant. 6 ans de retard, c'est mieux que jamais, non? – jgauffin

+0

@jgauffin Les upvotes ne sont jamais en retard. – sharptooth

0

Tout d'abord, cela dépend de la façon dont vous définissez la fuite de mémoire. Je considérerais normalement n'importe quel cas où la mémoire a été allouée mais aucun pointeur/référence ne lui reste pour être une fuite de mémoire, pas seulement des occasions où une application alloue continuellement de la mémoire sans la relâcher. (et vous voudrez probablement une autre définition si le GC est impliqué)

Avec cette définition, il n'est pas possible de voir toutes les fuites de mémoire via le gestionnaire de tâches car le processus peut ne pas rendre toute la mémoire à l'OS après il est libéré par le programme de sorte que vous ne verrez pas nécessairement tous les changements positifs ou négatifs dans l'utilisation de la mémoire.

Cela dit tout processus qui est constanly engloutit la mémoire ne vous semblent suspectes

0

Selon la construction du compilateur, il se peut que la mémoire ne soit pas réellement allouée avant d'avoir été accédée pour la première fois. Ainsi, par exemple ce script:

while(malloc(50)); 

pourrait dire à provoquer une fuite de mémoire - car il ne cesse assigner la mémoire jusqu'à ce qu'il soit tout pris. Cependant, si la mémoire n'est pas réellement allouée jusqu'à ce qu'elle soit utilisée, alors ce serait une «fuite invisible» - bien que j'admette que cela étire la définition de fuite;).

+0

Si ce n'est pas alloué, ce n'est pas une fuite de mémoire non plus. Non affecté = pas de mémoire. – jgauffin