565 Stimmen

Was sind private Bytes, virtuelle Bytes und Arbeitsgruppen?

Ich versuche, das Windows-Dienstprogramm perfmon zu verwenden, um Speicherlecks in einem Prozess zu beheben.

So erklärt perfmon die Begriffe:

Arbeitsset ist die aktuelle Größe der Arbeitsgruppe dieses Prozesses in Bytes. Die Arbeitsmenge ist die Menge der Speicherseiten, die zuletzt von den Threads des Prozesses berührt wurden. Wenn der freie Speicher im Computer über einem Schwellenwert liegt, werden Seiten in der Arbeitsgruppe eines Prozesses belassen, auch wenn sie nicht verwendet werden. Wenn der freie Speicher unter einen Schwellenwert fällt, werden die Seiten aus den Arbeitsgruppen entfernt. Wenn sie benötigt werden, werden sie vor dem Verlassen des Hauptspeichers wieder in die Arbeitsgruppe zurückgeschoben (soft-fault).

Virtuelle Bytes ist die aktuelle Größe des virtuellen Adressraums, den der Prozess verwendet, in Bytes. Die Verwendung von virtuellem Adreßraum impliziert nicht notwendigerweise eine entsprechende Verwendung von Festplatten- oder Hauptspeicherseiten. Der virtuelle Speicherplatz ist endlich, und der Prozess kann seine Fähigkeit, Bibliotheken zu laden, einschränken.

Private Bytes ist die aktuelle Größe des Speichers in Bytes, den dieser Prozess zugewiesen hat und der nicht mit anderen Prozessen geteilt werden kann.

Das sind die Fragen, die ich habe:

Ist es die Private Bytes, die ich messen sollte, um sicher zu sein, wenn der Prozess keine Lecks hat, da es keine gemeinsam genutzten Bibliotheken beteiligt und alle Lecks, wenn passieren, aus dem Prozess selbst kommen wird?

Wie hoch ist der gesamte Speicherbedarf des Prozesses? Sind es die virtuellen Bytes oder ist es die Summe aus virtuellen Bytes und Working Set?

Gibt es einen Zusammenhang zwischen Private Bytes, Working Set und Virtual Bytes?

Gibt es andere Tools, die einen besseren Überblick über die Speichernutzung geben?

591voto

Aaronaught Punkte 118136

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!

18voto

Mark Punkte 161

Die Definition der Perfmon-Zähler war von Anfang an fehlerhaft und aus irgendeinem Grund scheint es zu schwierig zu sein, sie zu korrigieren.

Einen guten Überblick über die Speicherverwaltung von Windows bietet das Video " Geheimnisse der Speicherverwaltung gelüftet " auf MSDN: Es deckt mehr Themen ab, als zum Aufspüren von Speicherlecks benötigt werden (z.B. Working Set Management), gibt aber genügend Details zu den relevanten Themen.


Um Ihnen einen Hinweis auf das Problem mit den Beschreibungen der Perfmon-Zähler zu geben, hier ist die Insider-Geschichte über private Bytes aus " Leistungszähler für private Bytes - Vorsicht! " auf MSDN:

F: Wann ist ein privates Byte kein privates Byte?

A: Wenn er nicht ansässig ist.

Der Zähler "Private Bytes" zeigt die Übergabekosten des Prozesses an. Das heißt, die Menge an Speicherplatz, die in der Auslagerungsdatei zugewiesen wurde, um den Inhalt des privaten Speichers aufzunehmen, falls er ausgelagert wird. Hinweis: Ich vermeide das Wort "reserviert", da es zu Verwechslungen mit virtuellem Speicher im reservierten Zustand kommen kann, der nicht übertragen wird.


Von " Leistungsplanung " auf MSDN:

3.3 Private Bytes

3.3.1 Beschreibung

Privater Speicher ist definiert als Speicher, der einem Prozess zugewiesen wird und nicht von anderen Prozessen gemeinsam genutzt werden kann. Dieser Speicher ist teurer als gemeinsamer Speicher, wenn mehrere solcher Prozesse auf einem Rechner ausgeführt werden. Privater Speicher in (traditionellen) nicht verwalteten DLLs besteht in der Regel aus C++-Statik und macht etwa 5 % der gesamten Arbeitsmenge der DLL aus.

15voto

Stephen Kellett Punkte 2893

Sie sollten nicht versuchen, Perfmon, den Task-Manager oder ein ähnliches Tool zu verwenden, um Speicherlecks festzustellen. Sie sind gut, um Trends zu erkennen, aber nicht viel mehr. Die Zahlen, die sie in absoluten Zahlen melden, sind zu vage und aggregiert, um für eine spezifische Aufgabe wie die Erkennung von Speicherlecks nützlich zu sein.

In einer früheren Antwort auf diese Frage wurden die verschiedenen Typen ausführlich erläutert.

Sie fragen nach einer Werkzeugempfehlung: Ich empfehle Memory Validator. Es ist in der Lage, Anwendungen zu überwachen, die Milliarden von Speicherzuweisungen vornehmen.

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

Haftungsausschluss: Ich habe Memory Validator entwickelt.

5voto

mcanti Punkte 1944

Hier gibt es eine interessante Diskussion: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ Ich habe diesen Thread so verstanden, dass die Freigabe kleiner Zuweisungen nicht in Private Bytes oder Working Set reflektiert wird.

Lange Rede kurzer Sinn:

wenn ich anrufe

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

dann spiegeln die privaten Bytes nur die Zuweisung, nicht aber die Freigabe wider.

wenn ich anrufe

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X