Wie kann ich herausfinden, wie viel Adressraum ist die Anwendung raubend und melden Sie dies Benutzer?

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

Frage

Ich schreibe den Speicher-Manager für eine Anwendung als Teil eines Teams von zwanzig Coder. Wir laufen aus Speicherquote, und wir müssen in der Lage sein zu sehen, was los ist, da wir nur über 700Mb erscheinen werden. Ich muss in der Lage zu berichten, wo es geht - Fragmentierung usw. Irgendwelche Ideen

?
War es hilfreich?

Lösung

Sie vorhandene Speicherdebugging-Tools für diese verwenden können, fand ich Speicher Validator 1 sehr nützlich, es ist in der Lage sowohl die API-Ebene zu verfolgen (Heap, neue ...) und OS-Ebene (Virtual Memory) Zuweisungen und zeigt virtuelle Speicherkarten.

Die andere Option, die ich auch sehr nützlich gefunden ist in der Lage sein, eine Karte des gesamten virtuellen Raumes zu entleeren, basierend auf Virtual Funktion. Mein Code für diese sieht wie folgt aus:

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);
}

Andere Tipps

Sie können auch mit Heap32ListFirst / Heap32ListNext und über geladene Module mit Module32First / Module32Next, aus der Tool-Hilfe-API in einem Prozess Informationen über den Haufen erfahren.

'Tool Help' entstand auf Windows 9x. Das ursprünglichen Prozessinformationen API unter Windows NT war PSAPI, die Funktionen, die teilweise (aber nicht vollständig) Überlappung mit Werkzeug-Hilfe.

Unsere (sehr groß) Anwendung (ein Win32-Spiel) gestartet „nicht genügend Kontingent“ Ausnahmen vor kurzem, und ich war geladen werfen mit herauszufinden, wo den gesamten Speicher ging. Es ist keine triviale Aufgabe - diese Frage und waren meine ersten Versuche herauszufinden. Heap Verhalten ist unerwartet, und genau Tracking wie viel Quote Sie verwendet haben und wie viel ist bisher nicht gelungen, zur Verfügung hat. In der Tat ist es nicht besonders nützliche Informationen sowieso - „Quote“ und „irgendwo Sachen zu setzen“ sind subtil und ärgerlicherweise unterschiedliche Konzepte. Die akzeptierte Antwort ist so gut wie es geht, obwohl Haufen und Module Aufzählen auch praktisch ist. Ich benutzte DebugDiag aus MS die wahren Schrecken der Situation zu sehen und verstehen, wie schwer es tatsächlich gründlich alles zu verfolgen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top