2010-02-02 4 views
0

Mon système est Windows XP. La taille virtuelle affichée dans TaskManager est différente avec MEMORYSTATUSEX.ullAvailVirtual obtenu à partir de GlobalMemoryStatusEx.Taille virtuelle et GlobalMemoryStatusEx

Lorsque je crée beaucoup de tampons et l'utilisation de la mémoire est en hausse, MEMORYSTATUSEX.ullAvailVirtual peut bien refléter l'utilisation de la taille virtuelle. C'est la même chose.

Mais quand je supprime la mémoire, taille virtuelle dans le gestionnaire de tâches est en panne, mais MEMORYSTATUSEX.ullAvailVirtual est encore très petit. Je ne sais pas pourquoi ....

Je suis totalement confus.

+0

Je pense que MEMORYSTATUSEX.ullAvailVirtual signifie uniquement la taille de la mémoire non réservée. Et tant que le processus est en cours, cette valeur est toujours inférieure ou égale à la valeur précédente. – Buzz

Répondre

0

Vous pourrait souffrir de la fragmentation de la mémoire. (C'est-à-dire que si vous sautez quelques octets entre chaque allocation importante, cela force les octets virtuels de votre application).

Vous pouvez trouver plus fiable de comparer les chiffres avec perfmon - les compteurs que j'ai toujours utilisés dans le passé ont été des octets privés (mémoire allouée) et des octets virtuels (espace d'adressage mémoire alloués) - si ces deux compteurs divergent , alors vous avez un problème de fragmentation de la mémoire, qui sera le résultat d'une fuite de mémoire. Les chiffres dans Task Manager, tout en vrai et précis, ne véhiculent rien de particulièrement utile.

0

Lorsque vous supprimez la mémoire allouée, le système d'exploitation ne renvoie pas immédiatement cette mémoire mais la conserve réservée au processus, au moins jusqu'à ce qu'un autre processus ait besoin de cette mémoire. Cela améliore les performances, car le même processus peut avoir besoin de la mémoire supprimée juste quelques ms plus tard.

Pour libérer vraiment la mémoire supprimé, vous pouvez appeler

SetProcessWorkingSetSize(GetCurrentProcess(), (SIZE_T)-1, (SIZE_T)-1); 

Peut-être qui forcera GlobalMemoryStatusEx() pour renvoyer les valeurs que vous attendez?

+0

Merci. Je ne suis pas sûr si je vais l'essayer, car cela semble un impact sur le système. Je vais essayer de l'allocateur TBB. Je trouve que sa vitesse d'allocation est plus rapide que CRT par défaut. Il semble distinctif dans une grande quantité d'allocation de mémoire. – Buzz

Questions connexes