Freitag, 18. März 2011

Speicherauslastung eines Prozesses ermitteln

Der heute Post wird nach den etwas längeren vorhergenden Posts wieder etwas kürzer, ich möchte euch zeigen, wie man mit C# die Speicherauslastung eines Prozesses ermittelt.
Die dafür erforderliche Eigenschaft heißt WorkingSet64 aus der Klasse System.Diagnostics.Process. Sie gibt die Anzahl an Bytes an, die von dem jeweiligen Prozess im Arbeitsspeicher belegt sind - korreliert also in etwa mit der Spalte "Arbeitsspeicher" im Taskmanager.
Um die Speicherbenutzung eines bestimmten Prozesses zu ermitteln, muss dieser zuerst "abgegriffen" werden, zum Beispiel über die Funktion Process.GetProcessesByName() (ein paar Hintergrundinfos zu dieser gibt's in diesem Post).
Die Funktion sucht nach Prozessen mit dem übergebenen Namen und speichert alle diese im Ergebnisarray.
Der folgende Code ermittelt die Speicherauslastung des angegeben Prozesses, in dem er oben geannten Eigenschaft des ersten Eintrags im Array abfragt - falls mehrere Proezsse mit gleichem Namen vorhanden sind, müssen ggf. weitere Maßnahmen ergriffen werden.
Im Beispiel wird die Auslastung des ersten geöffneten Editorprozesses abgefragt:

Process[] Application;
Application = Process.GetProcessesByName("notepad");
long MemorySize = Application[0].WorkingSet64;

Kommentare:

  1. kann man dan auch überprüfen wenn die speicherauslstung höher ist als eine vorgegebene Zahl?

    AntwortenLöschen
  2. Ja klar, wo ist der Haken?
    Die Abfrage, ob die Speicherauslastung größer als eine bestimmte Zahl ist, kann ja ganz normal mit einer if - Abfrage erledigt werden.
    Insofern denke ich mal, du möchtest eher wissen, wie die Auslastung regelmäßig überprüft werden kann?
    Das könnte man z.B. mit einem Timer erledigen, in dessen Tick Ereignis die Abfrage durchgeführt wird.

    AntwortenLöschen
  3. Kann man von einem Prozess auch den Offset der Speicherbelegung ermitteln? Ich würde gerne den RAM untersuchen, den ein Prozess für sich beansprucht.

    AntwortenLöschen
  4. "long MemorySize = Process.GetCurrentProcess().WorkingSet64;"

    is kürzer

    AntwortenLöschen