Ich versuche, das Dienstprogramm perfmon windows zu verwenden, um Speicherlecks in einem Prozess zu debuggen.
So erklärt perfmon die Begriffe:
Arbeitssatz ist die aktuelle Größe des Arbeitssatzes dieses Prozesses in Byte. Der Arbeitssatz ist der Satz von Speicherseiten, die kürzlich von den Threads im Prozess berührt wurden. Wenn der freie Speicher im Computer einen Schwellenwert überschreitet, bleiben Seiten im Arbeitssatz eines Prozesses, auch wenn sie nicht verwendet werden. Wenn der freie Speicher einen Schwellenwert unterschreitet, werden Seiten aus Arbeitssätzen abgeschnitten. Wenn sie benötigt werden, werden sie vor dem Verlassen des Hauptspeichers wieder in den Arbeitssatz zurückgeführt.
Virtuelle Bytes ist die aktuelle Größe des vom Prozess verwendeten virtuellen Adressraums in Byte. Die Verwendung des virtuellen Adressraums bedeutet nicht unbedingt die entsprechende Verwendung von Festplatten- oder Hauptspeicherseiten. Der virtuelle Raum ist endlich und der Prozess kann seine Fähigkeit zum Laden von Bibliotheken einschränken.
Private Bytes ist die aktuelle Größe des von diesem Prozess zugewiesenen Speichers in Bytes, die nicht mit anderen Prozessen gemeinsam genutzt werden kann.
Das sind die Fragen, die ich habe:
Sind es die privaten Bytes, die ich messen sollte, um sicherzugehen, dass der Prozess Lecks aufweist, da keine gemeinsam genutzten Bibliotheken vorhanden sind und Lecks, falls sie auftreten, vom Prozess selbst stammen?
Wie viel Speicher belegt der Prozess insgesamt? Sind es die virtuellen Bytes oder die Summe aus virtuellen Bytes und Arbeitssatz?
Gibt es eine Beziehung zwischen privaten Bytes, Arbeitssatz und virtuellen Bytes?
Gibt es andere Tools, die eine bessere Vorstellung von der Speichernutzung geben?
Antworten:
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:
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.
quelle
Sie sollten nicht versuchen, Perfmon, Task-Manager oder ein ähnliches Tool zu verwenden, um Speicherlecks zu ermitteln. Sie sind gut, um Trends zu erkennen, aber sonst nicht viel. Die Zahlen, die sie in absoluten Zahlen angeben, sind zu vage und aggregiert, um für eine bestimmte Aufgabe wie die Erkennung von Speicherlecks nützlich zu sein.
Eine frühere Antwort auf diese Frage hat eine gute Erklärung für die verschiedenen Typen gegeben.
Sie fragen nach einer Toolempfehlung: Ich empfehle Memory Validator. Kann Anwendungen überwachen, die Milliarden von Speicherzuweisungen vornehmen.
http://www.softwareverify.com/cpp/memory/index.html
Haftungsausschluss: Ich habe Memory Validator entwickelt.
quelle
Die Definition der Perfmon-Zähler wurde von Anfang an gebrochen und scheint aus irgendeinem Grund zu schwer zu korrigieren zu sein.
Einen guten Überblick über die Windows-Speicherverwaltung finden Sie im Video " Mysteries of Memory Management Revealed " auf MSDN: Es behandelt mehr Themen als zur Verfolgung von Speicherlecks erforderlich (z. B. Verwaltung von Arbeitssätzen), enthält jedoch genügend Details zu den relevanten Themen.
Um Ihnen einen Hinweis auf das Problem mit den Beschreibungen der Perfmon-Zähler zu geben, finden Sie hier die Insider-Informationen zu privaten Bytes aus "Leistungsindikator für private Bytes - Vorsicht! " Auf MSDN:
Von " Leistungsplanung " auf MSDN:
quelle
Hier gibt es eine interessante Diskussion: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ Mein Verständnis dieses Threads ist, dass kleine Zuweisungen freigegeben werden nicht in privaten Bytes oder Arbeitssätzen wiedergegeben.
Um es kurz zu machen:
wenn ich anrufe
dann spiegeln die privaten Bytes nur die Zuordnung wider, nicht die Freigabe.
wenn ich anrufe
dann spiegeln die privaten Bytes die Zuordnung und die Freigabe korrekt wider.
quelle