Frage

Ich versuche herauszufinden, wie viel Speicher mein eigener .Net-Serverprozess verwendet (zu Überwachungs- und Protokollierungszwecken).

Ich benutze:

Process.GetCurrentProcess().PrivateMemorySize64

Das Process-Objekt verfügt jedoch über mehrere verschiedene Eigenschaften, mit denen ich den verwendeten Speicherplatz ablesen kann:Paged, NonPaged, PagedSystem, NonPagedSystem, Private, Virtual, WorkingSet

und dann die „Gipfel“:Ich vermute, dass sie nur die Maximalwerte speichern, die diese letzten jemals erreicht haben.

Das Durchlesen der MSDN-Definition jeder Eigenschaft hat sich für mich als nicht besonders hilfreich erwiesen.Ich muss zugeben, dass mein Wissen darüber, wie Speicher verwaltet wird (was Paging und Virtual betrifft), sehr begrenzt ist.

Meine Frage lautet also offensichtlich: „Welches soll ich verwenden?“, und ich weiß, dass die Antwort „Es kommt darauf an“ lautet.

Dieser Prozess speichert im Grunde genommen eine Reihe von Listen im Speicher der Dinge, die vor sich gehen, während andere Prozesse mit ihm kommunizieren und ihn nach Dingen abfragen.Ich gehe davon aus, dass der Server, auf dem dies ausgeführt wird, viel RAM benötigt, und frage daher diese Daten im Laufe der Zeit ab, um den RAM-Bedarf im Vergleich zu den Größen der darin enthaltenen Listen abschätzen zu können.

Also...Welches sollte ich verwenden und warum?

War es hilfreich?

Lösung

Wenn Sie wissen möchten, wie viel der GC verbraucht, versuchen Sie Folgendes:

GC.GetTotalMemory(true)

Wenn Sie wissen möchten, was Ihr Prozess von Windows verwendet (Spalte „VM-Größe“ im TaskManager), versuchen Sie Folgendes:

Process.GetCurrentProcess().PrivateMemorySize64

Wenn Sie wissen möchten, was Ihr Prozess im RAM hat (im Gegensatz zur Auslagerungsdatei) (Spalte „Speichernutzung“ im TaskManager), versuchen Sie Folgendes:

Process.GetCurrentProcess().WorkingSet64

Sehen Hier Weitere Erläuterungen zu den verschiedenen Speicherarten finden Sie hier.

Andere Tipps

OK, ich habe über Google die gleiche Seite gefunden, die Lars erwähnt hat, und ich glaube, dass es eine großartige Erklärung für Leute ist, die nicht genau wissen, wie das Gedächtnis funktioniert (wie ich).

http://shsc.info/WindowsMemoryManagement

Mein kurzes Fazit war:

  • Private Bytes = Der Speicher, den mein Prozess zum Speichern von Daten angefordert hat.Einige davon können auf die Festplatte ausgelagert sein oder nicht.Das sind die Informationen, nach denen ich gesucht habe.

  • Virtuelle Bytes = Die privaten Bytes plus der mit anderen Prozessen geteilte Speicherplatz für geladene DLLs usw.

  • Arbeitssatz = Der Teil des gesamten Speichers meines Prozesses, der nicht auf die Festplatte ausgelagert wurde.Daher sollte die auf die Festplatte ausgelagerte Menge (Virtuell – Arbeitssatz) sein.

Vielen Dank an alle für eure Hilfe!

Wenn Sie den „Speicher (Privater Arbeitssatz)“ wie im Windows Vista-Task-Manager angezeigt verwenden möchten, der dem Process Explorer „WS Private Bytes“ entspricht, finden Sie hier den Code.Wahrscheinlich ist es am besten, diese Endlosschleife in einen Thread/eine Hintergrundaufgabe zu werfen, um Echtzeitstatistiken zu erhalten.

using System.Threading;
using System.Diagnostics;

//namespace...class...method

Process thisProc = Process.GetCurrentProcess();
PerformanceCounter PC = new PerformanceCounter();

PC.CategoryName = "Process";
PC.CounterName = "Working Set - Private";
PC.InstanceName = thisProc.ProcessName;

while (true)
{
 String privMemory = (PC.NextValue()/1000).ToString()+"KB (Private Bytes)";
 //Do something with string privMemory

 Thread.Sleep(1000);
}

Um den Mehrwert zu erhalten, den der Task-Manager bietet, ziehe ich den Hut vor Mike Regans Lösung oben.Allerdings eine Änderung:es ist nicht: perfCounter.NextValue()/1000; Aber perfCounter.NextValue()/1024; (d. h.ein echtes Kilobyte).Dies ergibt den genauen Wert, den Sie im Task-Manager sehen.

Im Folgenden finden Sie eine vollständige Lösung für die einfache Anzeige der „Speichernutzung“ (Task-Manager, wie angegeben) in Ihrer WPF- oder WinForms-App (in diesem Fall einfach im Titel).Rufen Sie einfach diese Methode im neuen Window-Konstruktor auf:

    private void DisplayMemoryUsageInTitleAsync()
    {
        origWindowTitle = this.Title; // set WinForms or WPF Window Title to field
        BackgroundWorker wrkr = new BackgroundWorker();
        wrkr.WorkerReportsProgress = true;

        wrkr.DoWork += (object sender, DoWorkEventArgs e) => {
            Process currProcess = Process.GetCurrentProcess();
            PerformanceCounter perfCntr = new PerformanceCounter();
            perfCntr.CategoryName = "Process";
            perfCntr.CounterName = "Working Set - Private";
            perfCntr.InstanceName = currProcess.ProcessName;

            while (true)
            {
                int value = (int)perfCntr.NextValue() / 1024;
                string privateMemoryStr = value.ToString("n0") + "KB [Private Bytes]";
                wrkr.ReportProgress(0, privateMemoryStr);
                Thread.Sleep(1000);
            }
        };

        wrkr.ProgressChanged += (object sender, ProgressChangedEventArgs e) => {
            string val = e.UserState as string;
            if (!string.IsNullOrEmpty(val))
                this.Title = string.Format(@"{0}   ({1})", origWindowTitle, val);
        };

        wrkr.RunWorkerAsync();
    }`

Der Arbeitssatz ist keine gute Eigenschaft.Soweit ich weiß, enthält es alles, was der Prozess berühren kann, sogar Bibliotheken, die von mehreren Prozessen gemeinsam genutzt werden, sodass Sie in diesem Zähler doppelt gezählte Bytes sehen.Der private Speicher ist ein viel besserer Zähler.

Ich würde vorschlagen, auch zu überwachen, wie oft Seitenfehler auftreten.Ein Seitenfehler tritt auf, wenn Sie versuchen, auf Daten zuzugreifen, die aus dem physischen Speicher in eine Auslagerungsdatei verschoben wurden, und das System die Seite von der Festplatte lesen muss, bevor Sie auf diese Daten zugreifen können.

Ist das eine angemessene Beschreibung?Ich möchte dies gerne mit meinem Team teilen. Teilen Sie mir daher bitte mit, ob es falsch (oder unvollständig) ist:

In C# gibt es mehrere Möglichkeiten, abzufragen, wie viel Speicher mein Prozess verwendet.

  • Der zugewiesene Speicher kann verwaltet (von der CLR) oder nicht verwaltet werden.
  • Der zugewiesene Speicher kann virtuell (auf der Festplatte gespeichert) oder geladen (in RAM-Seiten) sein.
  • Der zugewiesene Speicher kann privat (nur vom Prozess verwendet) oder gemeinsam genutzt (z. B.Zugehörigkeit zu einer DLL, auf die andere Prozesse verweisen).

Vor diesem Hintergrund finden Sie hier einige Möglichkeiten, die Speichernutzung in C# zu messen:

1) Process.VirtualMemorySize64():Gibt den gesamten von einem Prozess verwendeten Speicher zurück – verwaltet oder nicht verwaltet, virtuell oder geladen, privat oder gemeinsam genutzt.

2) Process.PrivateMemorySize64():Gibt den gesamten privaten Speicher zurück, der von einem Prozess verwendet wird – verwaltet oder nicht verwaltet, virtuell oder geladen.

3) Process.WorkingSet64():Gibt den gesamten privaten, geladenen Speicher zurück, der von einem Prozess verwendet wird – verwaltet oder nicht verwaltet

4) GC.GetTotalMemory():Gibt die Menge des verwalteten Speichers zurück, der vom Garbage Collector überwacht wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top