Die kurze Antwort auf diese Frage lautet, dass Keiner dieser Werte ist ein zuverlässiger Indikator dafür, wie viel Speicher eine ausführbare Datei tatsächlich verwendet, und keiner von ihnen ist wirklich geeignet, um ein Speicherleck zu beheben.
Private Bytes beziehen sich auf den Speicherplatz, den die ausführbare Datei des Prozesses hat erbeten - nicht notwendigerweise der Betrag, den er ausmacht tatsächlich verwenden . Sie sind "privat", weil sie (normalerweise) Dateien ausschließen, die dem Speicher zugeordnet sind (d.h. gemeinsam genutzte DLLs). Aber - und hier ist der Haken - sie schließen nicht unbedingt den Speicher aus die von diesen Dateien zugewiesen werden . Es gibt keine Möglichkeit festzustellen, ob eine Änderung der privaten Bytes auf die ausführbare Datei selbst oder auf eine verknüpfte Bibliothek zurückzuführen ist. Private Bytes sind auch pas ausschließlich physischen Speicher; sie können auf die Festplatte oder in die Standby-Seitenliste ausgelagert werden (d.h. nicht mehr in Gebrauch, aber auch noch nicht ausgelagert).
Arbeitsset bezieht sich auf die gesamte physisch Speicher (RAM), der von dem Prozess verwendet wird. Im Gegensatz zu den privaten Bytes umfasst dieser Wert jedoch auch Dateien, die dem Speicher zugeordnet sind, und verschiedene andere Ressourcen, so dass es sich um eine noch ungenauere Messung handelt als die privaten Bytes. Dies ist derselbe Wert, der im Task-Manager unter "Speicherauslastung" angezeigt wird und in den letzten Jahren für endlose Verwirrung gesorgt hat. Der Speicher im Working Set ist "physisch" in dem Sinne, dass er ohne Seitenfehler adressiert werden kann; die Standby-Seitenliste ist jedoch auch Daher kann es vorkommen, dass die "Speicherauslastung" plötzlich sinkt, wenn Sie eine Anwendung minimieren.
Virtuelle Bytes sind die gesamten virtueller Adressraum durch den gesamten Prozess belegt. Dies ist wie die Arbeitsmenge in dem Sinne, dass sie speicherbelegte Dateien (gemeinsam genutzte DLLs) enthält, aber sie enthält auch Daten in der Standby-Liste und Daten, die bereits ausgelagert wurden und irgendwo in einer Auslagerungsdatei auf der Festplatte liegen. Die Summe der virtuellen Bytes, die von jedem Prozess auf einem stark ausgelasteten System verwendet wird, wird sich zu einem wesentlich größeren Speicher addieren, als der Rechner tatsächlich hat.
Das sind die Beziehungen:
- Private Bytes sind das, was Ihre Anwendung tatsächlich zugewiesen hat, schließen aber die Auslagerungsnutzung ein;
- Die Arbeitsgruppe besteht aus den nicht ausgelagerten privaten Bytes und den im Speicher abgebildeten Dateien;
- Virtuelle Bytes sind das Working Set plus ausgelagerte private Bytes und die Standby-Liste.
Hier gibt es noch ein weiteres Problem: Genauso wie gemeinsam genutzte Bibliotheken Speicher innerhalb Ihres Anwendungsmoduls zuweisen können, was zu potenziellen Fehlalarmen in den privaten Bytes Ihrer Anwendung führt, su Anwendung kann auch dazu führen, dass Speicher innerhalb der gemeinsam genutzt Module, was zu falschen Negative . Das bedeutet, dass es in Ihrer Anwendung tatsächlich möglich ist, ein Speicherleck zu haben, das sich niemals in den privaten Bytes manifestiert. Unwahrscheinlich, aber möglich.
Private Bytes sind eine vernünftige Angleichung des Speicherplatzes, den Ihre ausführbare Datei belegt, und kann dazu verwendet werden eingrenzen eine Liste potenzieller Kandidaten für ein Speicherleck; wenn Sie sehen, dass die Zahl ständig und endlos wächst, sollten Sie diesen Prozess auf ein Leck überprüfen. Dies ist jedoch nicht möglich, beweisen dass ein Leck vorhanden ist oder nicht.
Eines der effektivsten Werkzeuge zum Aufspüren/Korrigieren von Speicherlecks in Windows ist eigentlich Visual Studio (Link führt zur Seite über die Verwendung von VS für Speicherlecks, nicht zur Produktseite). Rational Reinigen ist eine weitere Möglichkeit. Microsoft hat auch eine allgemeinere Best-Practice-Dokument zu diesem Thema. Es gibt noch weitere Tools, die in diesem vorherige Frage .
Ich hoffe, dass dies ein paar Dinge klärt! Das Aufspüren von Speicherlecks ist eine der schwierigsten Aufgaben bei der Fehlersuche. Viel Glück!