2010-06-12 6 views
14

Mon application s'exécute pendant quelques heures, Il n'y a aucune augmentation de la valeur (vmsize, mémoire) du Gestionnaire des tâches. Mais après quelques heures je sors des erreurs de mémoire.Qu'est-ce que "Taille virtuelle" dans l'explorateur de processus sysinternals

Dans sysinternals, je vois que "Virtual Size" augmente de façon continue, et quand il atteint environ 2 Go, je commence à avoir des erreurs de mémoire.

Alors, quel genre de fuite de mémoire est-ce? Comment puis-je le démontrer avec un code? Est-il possible de reproduire la même chose avec n'importe quel morceau de code où aucune augmentation de la valeur de mémoire, mais seulement la taille virtuelle dans l'explorateur de processus sysinternsl augmente?

Merci pour toutes suggestions

+0

Cette question doit avoir une balise Windows. J'étais assez tenté de répondre à partir de Linux pov;) – Dummy00001

Répondre

4

Du son des choses, vous êtes à court d'espace d'adressage. Windows 32 bits sépare l'espace d'adressage en deux, une moitié pour le programme utilisateur et l'autre moitié pour le système, chacun recevant ainsi 2 gigaoctets. La cause la plus fréquente de ceci est la fragmentation de l'espace mémoire au point que vous ne pouvez pas trouver un morceau assez grand pour une allocation. Malheureusement, sans en savoir plus sur ce que vous faites, il est difficile de deviner pourquoi cela pourrait bien se produire.

8

La taille virtuelle est le nombre de pages allouées par le processus. Les pages qui ne sont pas actuellement dans l'ensemble de travail (physiquement chargées dans la RAM) seront dans le fichier de page du système.

Typiquement, vous allouez de la mémoire qui n'est pas libérée. Cela peut être difficile à traquer dans le code sans outils spéciaux comme Rational Purify ou Boundschecker par exemple. Avec sysinternals vous voyez qu'il doit y avoir une fuite mais cela ne vous dira jamais où ...

Si votre logiciel n'est pas très grand, vous pouvez essayer de vous déconnecter de la "nouvelle" et "supprimer" et voir s'il y a trop d'objets en mémoire en gérant les listes d'objets alloués (en faisant votre propre débogueur de mémoire pour ainsi dire). Il y a quelques aides dans le monde de Windows comme le CRT memory checking utils from Microsoft. Ils sont utiles dans certains cas.

2

Selon this thread sur le forum Sysinternals, la taille virtuel correspond à l'espace d'adressage du processus (je devine pages Commited et réservés de mémoire)

1

Il semble que la taille virtuelle comprend alloué pages avec des types suivants: MEM_MAPPED (pour les données vues) MEM_IMAGE (pour les vues d'images exécutables) MEM_PRIVATE (mémoire habituelle page allouée)

Ce n'est pas la seule « mémoire » pour les données, mais comprend également un espace de page pour * .dll-s et mappage de fichiers mécanisme.

Questions connexes