Die kurze Antwort auf diese Frage lautet, dass keiner dieser Werte ein zuverlässiger Indikator dafür ist, wie viel Speicher eine ausführbare Datei tatsächlich verwendet, und keiner von ihnen wirklich zum Debuggen eines Speicherverlusts geeignet ist.
Privates Bytes bezieht sich auf die Größe des Speichers , dass der Prozess ausführbar ist gefragt - nicht notwendigerweise die Menge ist eigentlich mit . Sie sind "privat", da sie (normalerweise) speicherabgebildete Dateien (dh gemeinsam genutzte DLLs) ausschließen. Aber - hier ist der Haken - sie schließen den von diesen Dateien zugewiesenen Speicher nicht unbedingt aus . Es kann nicht festgestellt werden, 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 nicht ausschließlich physischer Speicher. Sie können auf die Festplatte oder in die Liste der Standby-Seiten ausgelagert werden (dh sie werden nicht mehr verwendet, aber auch noch nicht ausgelagert).
Arbeitssatz bezieht sich auf den gesamten physischen Speicher (RAM), der vom Prozess verwendet wird. Im Gegensatz zu privaten Bytes umfasst dies jedoch auch speicherabgebildete Dateien und verschiedene andere Ressourcen, sodass die Messung noch weniger genau ist als bei privaten Bytes. Dies ist derselbe Wert, der in "Mem Usage" des Task-Managers gemeldet wird und in den letzten Jahren zu endloser Verwirrung geführt hat. Der Speicher im Arbeitssatz ist "physisch" in dem Sinne, dass er ohne Seitenfehler adressiert werden kann. Die Liste der Standby-Seiten befindet sich jedoch auch noch physisch im Speicher, wird jedoch nicht im Arbeitssatz gemeldet. Aus diesem Grund wird die "Mem-Verwendung" möglicherweise plötzlich gelöscht, wenn Sie eine Anwendung minimieren.
Virtuelle Bytes sind der gesamte virtuelle Adressraum, der vom gesamten Prozess belegt wird. Dies ähnelt dem Arbeitssatz in dem Sinne, dass er speicherabgebildete Dateien (gemeinsam genutzte DLLs) enthält, aber auch Daten in der Standby-Liste und Daten, die bereits ausgelagert wurden und sich irgendwo in einer Auslagerungsdatei auf der Festplatte befinden. Die gesamten virtuellen Bytes, die von jedem Prozess auf einem System unter hoher Last verwendet werden, summieren sich zu erheblich mehr Speicher als die Maschine tatsächlich hat.
Die Beziehungen sind also:
- Private Bytes sind das, was Ihre App tatsächlich zugewiesen hat, umfassen jedoch die Verwendung von Auslagerungsdateien.
- Der Arbeitssatz besteht aus nicht ausgelagerten privaten Bytes und Dateien mit Speicherzuordnung.
- Virtuelle Bytes sind der Arbeitssatz plus ausgelagerte private Bytes und die Standby-Liste.
Hier gibt es ein anderes Problem. So wie gemeinsam genutzte Bibliotheken Speicher in Ihrem Anwendungsmodul zuweisen können, was zu potenziellen Fehlalarmen führen kann, die in den privaten Bytes Ihrer App gemeldet werden, kann Ihre Anwendung auch Speicher in den gemeinsam genutzten Modulen zuweisen , was zu falsch negativen Ergebnissen führt . Das heißt, es ist tatsächlich möglich, dass Ihre Anwendung einen Speicherverlust aufweist, der sich überhaupt nicht in den privaten Bytes manifestiert. Unwahrscheinlich, aber möglich.
Private Bytes sind eine vernünftige Annäherung der Größe des Speichers der ausführbaren Datei verwendet , und kann Hilfe verwendet wird , verengt eine Liste der potenziellen Kandidaten für ein Speicherleck; Wenn Sie sehen, dass die Anzahl ständig und endlos wächst und wächst, sollten Sie diesen Prozess auf ein Leck überprüfen. Dies kann jedoch nicht beweisen, dass ein Leck vorliegt oder nicht.
Eines der effektivsten Tools zum Erkennen / Korrigieren von Speicherlecks in Windows ist Visual Studio (der Link führt zur Seite zur Verwendung von VS für Speicherlecks, nicht zur Produktseite). Rational Purify ist eine weitere Möglichkeit. Microsoft verfügt auch über ein allgemeineres Best-Practice-Dokument zu diesem Thema. In dieser vorherigen Frage sind weitere Tools aufgeführt .
Ich hoffe das klärt ein paar Dinge auf! Das Aufspüren von Speicherlecks ist eines der schwierigsten Dinge beim Debuggen. Viel Glück.