Comment puis-je connaître la quantité d'espace d'adressage utilisée par l'application et le signaler à l'utilisateur?

StackOverflow https://stackoverflow.com/questions/90940

Question

J'écris le gestionnaire de mémoire pour une application, dans le cadre d'une équipe d'une vingtaine de codeurs. Nous manquons de quota de mémoire et nous devons être en mesure de voir ce qui se passe, car nous ne semblons utiliser que 700 Mo environ. Je dois pouvoir indiquer où tout va aller - fragmentation, etc. Des idées?

Était-ce utile?

La solution

Vous pouvez utiliser les outils de débogage de la mémoire existants pour cela. J'ai trouvé le validateur de mémoire 1 est très utile, il permet de suivre à la fois les allocations au niveau API (tas, nouveauté ...) et au niveau système d'exploitation (mémoire virtuelle) et d'afficher des cartes de mémoire virtuelle.

L’autre option que j’ai également trouvée très utile est de pouvoir vider une carte de tout l’espace virtuel en fonction de la fonction VirtualQuery. Mon code pour cela ressemble à ceci:

void PrintVMMap()
{
  size_t start = 0;
  // TODO: make portable - not compatible with /3GB, 64b OS or 64b app
  size_t end = 1U<<31; // map 32b user space only - kernel space not accessible
  SYSTEM_INFO si;
  GetSystemInfo(&si);
  size_t pageSize = si.dwPageSize;
  size_t longestFreeApp = 0;

  int index=0;
  for (size_t addr = start; addr<end; )
  {
    MEMORY_BASIC_INFORMATION buffer;
    SIZE_T retSize = VirtualQuery((void *)addr,&buffer,sizeof(buffer));
    if (retSize==sizeof(buffer) && buffer.RegionSize>0)
    {
      // dump information about this region
      printf(.... some buffer information here ....);
      // track longest feee region - usefull fragmentation indicator
      if (buffer.State&MEM_FREE)
      {
        if (buffer.RegionSize>longestFreeApp) longestFreeApp = buffer.RegionSize;
      }
      addr += buffer.RegionSize;
      index+= buffer.RegionSize/pageSize;
    }
    else
    {
      // always proceed
      addr += pageSize;
      index++;
    }
  }
  printf("Longest free VM region: %d",longestFreeApp);
}

Autres conseils

Vous pouvez également trouver des informations sur les tas d'un processus avec Heap32ListFirst / Heap32ListNext et sur les modules chargés avec Module32First / Module32Next, à partir de l'API d'aide de l'outil.

L’aide de l’outil provient de Windows 9x. L'API d'origine des informations de processus sous Windows NT était PSAPI, qui offre des fonctions qui se chevauchent partiellement (mais pas complètement) avec l'aide de l'outil.

Notre (énorme) application (un jeu Win32) a commencé à lancer "Pas assez de quota". exceptions récemment, et j’ai été chargé de découvrir où se trouvait toute la mémoire. Ce n’est pas un travail banal - cette question et DebugDiag à partir de MS pour voir la véritable horreur de la situation et comprendre à quel point il est difficile de tout suivre en profondeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top