Wie berechnet man die Speichernutzung wie im Task-Manager?
OK, ich verwende also WMI (.net / C #), um ständig Daten zu einem bestimmten Prozess zu erfassen, der auf dem Computer ausgeführt wird. Ich bekomme die Daten durch Win32_PerfFormattedData_PerfProc_Process Klasse. Diese Klasse hat viele Eigenschaften, aber die, an denen wir interessiert sind, sind folgende:
uint64 PageFileBytes;
Wert in Byte, den dieser Prozess in den Auslagerungsdateien verwendet hat. Auslagerungsdateien speichern Speicherseiten, die vom Prozess verwendet werden und nicht in anderen Dateien enthalten sind. Auslagerungsdateien werden von allen Prozessen gemeinsam genutzt, und mangelnder Speicherplatz in Auslagerungsdateien kann verhindern, dass andere Prozesse Speicher zuweisen.
uint32 PoolNonpagedBytes;
Wert, in Byte, im nicht ausgelagerten Pool, ein Bereich des Systemspeichers (vom Betriebssystem verwendeter physischer Speicher) für Objekte, die nicht auf die Festplatte geschrieben werden können, jedoch im physischen Speicher verbleiben müssen, solange sie zugeordnet sind. Die PoolNonpagedBytes in Win32_PerfFormattedData_PerfOS_Memory werden anders berechnet als die PoolPagedBytes-Eigenschaft in Win32_PerfFormattedData_PerfProc_Process, daher entspricht sie möglicherweise nicht der Summe der PoolPagedBytes für alle Instanzen von Win32_PerfPocessedProcedD. Diese Eigenschaft zeigt nur den zuletzt beobachteten Wert an. Es ist kein Durchschnitt.
uint32 PoolPagedBytes;
Wert in Byte im ausgelagerten Pool, ein Bereich des Systemspeichers (vom Betriebssystem verwendeter physischer Speicher) für Objekte, die auf die Festplatte geschrieben werden können, wenn sie nicht verwendet werden. Die PoolNonpagedBytes-Eigenschaft in Win32_PerfFormattedData_PerfOS_Memory wird anders berechnet als die PoolPagedBytes-Eigenschaft in Win32_PerfFormattedData_PerfProc_Process, sodass sie möglicherweise nicht der Summe von PoolPagedBytes für alle Instanzen von Win32_PerfocessFormattedProc Diese Eigenschaft zeigt nur den zuletzt beobachteten Wert an. Es ist kein Durchschnitt.
uint64 PrivateBytes;
Aktueller Wert in Byte, den dieser Prozess zugewiesen hat und der nicht mit anderen Prozessen geteilt werden kann.
uint64 VirtualBytes;
Aktuelle Größe des vom Prozess verwendeten virtuellen Adressraums in Byte. Die Verwendung des virtuellen Adressraums impliziert nicht notwendigerweise die entsprechende Verwendung von Platten- oder Hauptspeicherseiten. Der virtuelle Speicherplatz ist begrenzt, und durch die Verwendung von zu viel Speicherplatz kann der Prozess das Laden von Bibliotheken einschränken.
uint64 WorkingSet;
Maximale Anzahl in Byte in der Arbeitsgruppe dieses Prozesses zu einem beliebigen Zeitpunkt. 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 bestimmten Grenzwert ü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 wieder in den Arbeitsspeicher zurückgeführt.
Ich benutze gerade dasWorkingSet
-Feld, um die Speichernutzung des Prozesses zu melden. Dies stimmt jedoch nicht mit dem überein, was der Task-Manager anzeigt. Ich habe es mit @ versucPrivateBytes
aber das ist auch nicht "richtig". Der Prozess, den die App überwacht, ist ein .NET-Prozess (falls dies überhaupt von Bedeutung ist), und die App meldet, dass mindestens 100 MB mehr Speicher benötigt werden, als der Task-Manager gleichzeitig anzeigt.
So ist die Frage, wie lautet die "Formel" zum Berechnen der besten Annäherung an die vom Task-Manager angezeigte Speichernutzung des Prozesses?