2010-03-26 10 views
0

Des suggestions/conseils/liens/tutoriels seraient appréciés! :)Win32/MFC: Comment trouver de la mémoire libre (RAM) disponible?

+0

Je vous recommande d'affiner la question (ou d'en poser une nouvelle) et de donner plus d'informations générales sur ce que vous essayez de réaliser, dans quel but vous devez connaître la "RAM libre" et quel type d'opérations de mémoire votre programme le fait. Découvrir et interpréter l'état de la mémoire correctement n'est pas facile. Même si vous le savez, vous ne pouvez jamais être sûr que les opérations malloc/new réussissent, en raison de la fragmentation de la mémoire. J'ai eu le temps le plus terrible dans ma carrière en tant que programmeur parce que je croyais: Si j'ai assez de RAM dans mon ordinateur, je n'aurai pas de problèmes avec les opérations de mémoire. Je me trompais tellement. – Slauma

Répondre

9

Il n'y a vraiment pas de réponse à cela. Dans des circonstances normales, le système d'exploitation gardera quelque chose dans essentiellement toute la mémoire sur le système. Fondamentalement, une fois qu'il a lu quelque chose dans la mémoire, il gardera une copie de celui-ci en mémoire jusqu'à ce que quelque chose d'autre ait besoin de mémoire pour que le premier soit expulsé. Il y a un certain nombre de fonctions qui peuvent vous fournir des informations sur la mémoire, mais aucune d'entre elles n'essaie de renvoyer une quantité de mémoire complètement inutilisée. Le plus proche que je sache est GlobalMemoryStatusEx, qui retourne un nombre pour la quantité de mémoire disponible.

Cela signifie que tout ce qui est actuellement dans cette mémoire est actuellement à la fois dans la mémoire et sur le disque, de sorte que la copie en mémoire peut être jetée sans avoir à l'écrire sur le disque d'abord. Par exemple, si vous avez exécuté un programme, la majeure partie du code reste en mémoire (jusqu'à ce que quelque chose d'autre ait besoin de mémoire), au cas où vous décidiez de l'exécuter à nouveau. Puisque c'est juste une copie du programme sur le disque, il peut être jeté, et (si nécessaire) rechargé à partir du disque si nécessaire. Si vous voulez plus de détails, vous pouvez utiliser des choses comme VirtualQueryEx pour l'obtenir - mais cela va généralement vous surcharger d'informations, vous parler de chaque bloc de mémoire utilisé dans un processus donné, au lieu de donner une belle, nombre simple indiquant "x octets libres".

3

C'est assez facile de répondre, la RAM libre est toujours suffisamment proche de 0 pour la considérer comme nulle et ne pas déranger. La RAM inutilisée est toujours utilisée par le cache du système de fichiers, vous pouvez le voir dans l'onglet Taskmgr.exe, Performance.

Si vous voulez dire "mémoire virtuelle libre", le chiffre dont vous vous souciez vraiment, alors la réponse est "pas vraiment possible". Vous auriez besoin de HeapWalk(), une fonction très délicate et dangereuse à utiliser. Seul HeapWalk peut détecter les blocs du tas qui sont marqués libres mais qui sont toujours mappés. Le nombre auquel tu arriverais n'a aucun sens de toute façon. Un programme ne manque jamais de blocs de mémoire virtuelle libres, il manque toujours de blocs de mémoire assez grands en premier.

La détection de cette condition est assez facile. Malloc renvoie NULL, le nouvel opérateur lance std :: bad_alloc. Traiter avec la condition n'est pas facile. La résolution prend moins de deux cents dollars, à peu près les frais de licence pour une version 64 bits de Windows.

Questions connexes