wake-up-neo.net

Was sind private Bytes, virtuelle Bytes, Arbeitssets?

Ich versuche, das perfmon Windows-Dienstprogramm zu verwenden, um Speicherverluste 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 in dem Prozess berührt wurden. Wenn der freie Arbeitsspeicher auf dem Computer einen Schwellenwert überschreitet, verbleiben die Seiten im Arbeitssatz eines Prozesses, auch wenn sie nicht verwendet werden. Wenn der freie Speicher unter einen Schwellenwert fällt, werden Seiten aus Arbeitssätzen entfernt. Wenn sie benötigt werden, werden sie vor dem Verlassen des Hauptspeichers in den Arbeitsspeicher zurückgeführt.

Virtuelle Bytes ist die aktuelle Größe des vom Prozess verwendeten virtuellen Adressraums in Bytes. Die Verwendung des virtuellen Adressraums impliziert nicht notwendigerweise die entsprechende Verwendung von Platten- oder Hauptspeicherseiten. Der virtuelle Speicherplatz ist begrenzt und der Prozess kann die Fähigkeit zum Laden von Bibliotheken einschränken.

Private Bytes ist die aktuelle Größe des von diesem Prozess zugewiesenen Speichers in Byte, der nicht für andere Prozesse freigegeben werden kann.

Das sind die Fragen, die ich habe:

Sind es die privaten Bytes, die ich messen sollte, um sicherzugehen, dass der Prozess irgendwelche Lecks aufweist, da keine gemeinsam genutzten Bibliotheken beteiligt sind und irgendwelche Lecks, falls sie auftreten, vom Prozess selbst stammen?

Wie viel Speicher verbraucht der Prozess insgesamt? Handelt es sich um die virtuellen Bytes oder um die Summe aus virtuellen Bytes und Arbeitssatz?

Gibt es eine Beziehung zwischen Private Bytes, Working Set und Virtual Bytes?

Gibt es andere Tools, die eine bessere Vorstellung von der Speichernutzung geben?

453
pankajt

Die kurze Antwort auf diese Frage lautet: Keiner dieser Werte ist ein verlässlicher Indikator dafür, wie viel Speicher eine ausführbare Datei tatsächlich belegt, und keiner eignet sich wirklich zum Debuggen eines Speicherverlusts.

Private Bytes bezieht sich auf die Speicherkapazität, über die die ausführbare Prozessdatei verfügt fragte nach - nicht unbedingt auf die Speicherkapazität verwendet tatsächlich . Sie sind "privat", weil sie (normalerweise) speicherabgebildete Dateien (d. H. Gemeinsam genutzte DLLs) ausschließen. Aber - hier ist der Haken - sie schließen nicht unbedingt den Speicher aus , der von diesen Dateien zugewiesen wird . 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 Festplatte oder in der Standby-Seitenliste ausgelagert werden (d. h. 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 Speicherzuordnungsdateien und verschiedene andere Ressourcen, sodass die Messung noch ungenauer ist als bei den privaten Bytes. Dies ist derselbe Wert, der im Task-Manager unter "Mem Usage" angegeben wird und in den letzten Jahren für endlose Verwirrung gesorgt hat. Der Speicher im Working Set ist in dem Sinne "physisch", dass er ohne Seitenfehler adressiert werden kann. Die Standby-Seitenliste befindet sich jedoch auch 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 minimieren Anwendung.

Virtuelle Bytes sind die Gesamtmenge virtueller Adressraum, die vom gesamten Prozess belegt wird. Dies entspricht 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, erhöhen den Arbeitsspeicher erheblich.

Die Beziehungen sind also:

  • Private Bytes sind die von Ihrer App tatsächlich zugewiesenen Bytes, umfassen jedoch die Verwendung von Auslagerungsdateien.
  • Der Arbeitssatz besteht aus den nicht ausgelagerten privaten Bytes und den Dateien mit Speicherzuordnung.
  • Virtuelle Bytes sind der Arbeitssatz sowie die ausgelagerten privaten 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 Fehlmeldungen in den privaten Bytes Ihrer Anwendung führen kann, kann es auch vorkommen, dass Ihre Anwendung Speicher in shared Module, die zu false negatives führen. Das heißt, es ist tatsächlich möglich, dass Ihre Anwendung einen Speicherverlust aufweist, der sich in den privaten Bytes überhaupt nicht manifestiert. Unwahrscheinlich, aber möglich.

Private Bytes sind eine sinnvolle Annäherung der von Ihrer ausführbaren Datei verwendeten Speicherkapazität und können verwendet werden, um eingrenzen eine Liste potenzieller Kandidaten für eine Speicherkapazität zu erstellen Leck; Wenn Sie sehen, dass die Zahl ständig und endlos wächst, sollten Sie diesen Prozess auf ein Leck überprüfen. Dies kann jedoch nicht beweisen , dass es ein Leck gibt oder nicht.

Eines der effektivsten Tools zum Erkennen/Korrigieren von Speicherverlusten in Windows ist Visual Studio (Link zur Seite zur Verwendung von VS für Speicherverluste, nicht zur Produktseite). Rational Purify ist eine weitere Möglichkeit. Microsoft hat auch eine allgemeinere Best Practices-Dokument zu diesem Thema. In dieser vorherige Frage sind weitere Tools aufgeführt.

Ich hoffe das klärt ein paar Dinge auf! Das Aufspüren von Speicherlecks ist eine der schwierigsten Aufgaben beim Debuggen. Viel Glück.

477
Aaronaught

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 absoluten Zahlen sind zu vage und aggregiert, um für eine bestimmte Aufgabe wie die Erkennung von Speicherverlusten nützlich zu sein.

In einer früheren Antwort auf diese Frage wurde ausführlich erläutert, um welche Arten es sich handelt.

Sie fragen nach einer Tool-Empfehlung: Ich empfehle Memory Validator. Überwacht Anwendungen, die Milliarden von Speicherzuweisungen vornehmen.

http://www.softwareverify.com/cpp/memory/index.html

Haftungsausschluss: Ich habe Memory Validator entwickelt.

9
Stephen Kellett

Die Definition der Leistungsindikatoren ist von Anfang an fehlerhaft und scheint aus irgendeinem Grund zu schwer zu korrigieren zu sein.

Einen guten Überblick über die Windows-Speicherverwaltung gibt das Video " Geheimnisse der Speicherverwaltung aufgedeckt " weiter MSDN: Es werden mehr Themen behandelt, als zur Verfolgung von Speicherverlusten erforderlich sind (z. B. Verwaltung von Arbeitssätzen), es werden jedoch genügend Details zu den relevanten Themen angegeben.


Um Ihnen einen Hinweis auf das Problem mit den Beschreibungen der Leistungsindikatoren zu geben, finden Sie hier die Insider-Story zu privaten Bytes von " Leistungsindikator für private Bytes - Vorsicht! "auf MSDN:

F: Wann ist ein privates Byte kein privates Byte?

A: Wenn es keinen Wohnsitz hat.

Der Leistungsindikator für private Bytes gibt die Übergabegebühr des Prozesses an. Das heißt, die Menge an Speicherplatz, die in der Auslagerungsdatei zugewiesen wurde, um den Inhalt des privaten Speichers für den Fall aufzunehmen, dass dieser ausgelagert wird. Hinweis: Ich vermeide das Wort "reserviert", da es möglicherweise zu Verwechslungen mit dem nicht festgeschriebenen virtuellen Speicher im reservierten Zustand kommt.


Von " Leistungsplanung " auf MSDN:

3.3 Private Bytes

3.3.1 Beschreibung

Privater Speicher wird als Speicher definiert, der einem Prozess zugewiesen ist, der nicht von anderen Prozessen gemeinsam genutzt werden kann. Dieser Speicher ist teurer als der gemeinsam genutzte Speicher, wenn mehrere solcher Prozesse auf einem Computer ausgeführt werden. Der private Speicher in (herkömmlichen) nicht verwalteten DLLs besteht normalerweise aus C++ - Statiken und liegt in der Größenordnung von 5% der gesamten Arbeitsmenge der DLL.

8
Mark

Hier gibt es eine interessante Diskussion: http://social.msdn.Microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ Mein Verständnis davon Thread ist, dass das Freigeben kleiner Zuordnungen nicht in privaten Bytes oder Arbeitssätzen widergespiegelt wird.

Um es kurz zu machen:

wenn ich anrufe

p=malloc(1000);
free(p);

dann geben die privaten Bytes nur die Zuordnung wieder, nicht die Aufhebung der Zuordnung.

wenn ich anrufe

p=malloc(>512k);
free(p);

dann spiegeln die privaten Bytes die Zuordnung und die Freigabe korrekt wider.

5
mcanti