So erhalten Sie Speicher verfügbar oder werden in C # verwendet


136

Wie kann ich den verfügbaren RAM oder Speicher erhalten, der von der Anwendung verwendet wird?


Sie sollten sich die System.Diagnostics.ProcessKlasse ansehen .
Ronald Wildenberg

3
Beachten Sie, dass der derzeit verwendete physische RAM der Arbeitssatz ist. Der zugewiesene Speicher fällt in private oder gemeinsam genutzte Bytes (abhängig von der Art der Zuweisung).
Richard

Antworten:


172

Sie können verwenden:

Process proc = Process.GetCurrentProcess();

So erhalten Sie den aktuellen Prozess und verwenden:

proc.PrivateMemorySize64;

Um die private Speichernutzung zu erhalten. Weitere Informationen finden Sie unter diesem Link .


52
Es sollte wahrscheinlich beachtet werden, dass ein Aufruf von GetCurrentProcess selbst ziemlich viele Ressourcen zuweist. Rufen Sie Dispose für den zurückgegebenen Prozess auf, wenn Sie fertig sind, oder verpacken Sie den gesamten Code in einen "using" -Bereich.
Mathias Lykkegaard Lorenzen

9
Namespace: System.Diagnostics Assembly: System (in System.dll)
Enigma Plus

12
Ich möchte auch hinzufügen, dass die PrivateMemorySize64-Eigenschaft (+ andere Eigenschaften) selbst nicht automatisch aktualisiert wird, bis Refresh () aufgerufen wird. (Es ist auf der Seite unter dem obigen Link erwähnt.)
ScottRhee

1
Weitere Antworten finden Sie in dieser anderen ähnlichen Frage: stackoverflow.com/questions/14032515/…
Aaron D

1
@ScottRhee korrigiert mich, wenn ich falsch liege - aber ich möchte hinzufügen, dass die Eigenschaftswerte zum Zeitpunkt des Aufrufs "aktuell" sind GetCurrentProcess, aber nur aktualisiert werden müssen, wenn Sie vor dem Zugriff auf die Eigenschaften andere Vorgänge ausführen. Quelle - Anmerkungen besagen, dass die Eigenschaften zum Zeitpunkt der Erstellung des Prozess-Snapshots korrekt sind.
Tabjsina

38

Möglicherweise möchten Sie die GC.GetTotalMemory- Methode überprüfen .

Es ruft die Anzahl der Bytes ab, von denen derzeit angenommen wird, dass sie vom Garbage Collector zugewiesen werden.


12
Nur in verwalteten Haufen. Arkains Antwort sollte sowohl native als auch verwaltete Haufen enthalten.
Yaur

25

System.Environment verfügt über WorkingSet - eine 64-Bit-Ganzzahl mit Vorzeichen, die die Anzahl der Bytes des physischen Speichers enthält, die dem Prozesskontext zugeordnet sind.

Wenn Sie viele Details wünschen, gibt es System.Diagnostics.PerformanceCounter , aber die Einrichtung ist etwas aufwändiger.


Können Sie (oder überhaupt jemand) ein Beispiel für die Verwendung von PerformanceCounter geben, um den verfügbaren / verwendeten Systemspeicher des Systems zu erhalten?
Das Element der Schöpfung

11

Schauen Sie hier für Details.

private PerformanceCounter cpuCounter;
private PerformanceCounter ramCounter;
public Form1()
{
    InitializeComponent();
    InitialiseCPUCounter();
    InitializeRAMCounter();
    updateTimer.Start();
}

private void updateTimer_Tick(object sender, EventArgs e)
{
    this.textBox1.Text = "CPU Usage: " +
    Convert.ToInt32(cpuCounter.NextValue()).ToString() +
    "%";

    this.textBox2.Text = Convert.ToInt32(ramCounter.NextValue()).ToString()+"Mb";
}

private void Form1_Load(object sender, EventArgs e)
{
}

private void InitialiseCPUCounter()
{
    cpuCounter = new PerformanceCounter(
    "Processor",
    "% Processor Time",
    "_Total",
    true
    );
}

private void InitializeRAMCounter()
{
    ramCounter = new PerformanceCounter("Memory", "Available MBytes", true);

}

Wenn Sie den Wert 0 erhalten, müssen Sie NextValue()zweimal aufrufen . Dann gibt es den tatsächlichen Wert der CPU-Auslastung an. Weitere Details finden Sie hier .


6

Neben @JesperFyhrKnudsen ‚s Antwort und @MathiasLykkegaardLorenzen ‘ s Kommentar, sollten Sie besser disposedie zurück Processnach Gebrauch.

Um das zu entsorgen Process, können Sie es in einen Bereich usingeinschließen oder Disposeden zurückgegebenen Prozess ( procVariable) aufrufen .

  1. using Umfang:

    var memory = 0.0;
    using (Process proc = Process.GetCurrentProcess())
    {
        // The proc.PrivateMemorySize64 will returns the private memory usage in byte.
        // Would like to Convert it to Megabyte? divide it by 2^20
           memory = proc.PrivateMemorySize64 / (1024*1024);
    }
  2. Oder DisposeMethode:

    var memory = 0.0;
    Process proc = Process.GetCurrentProcess();
    memory = Math.Round(proc.PrivateMemorySize64 / (1024*1024), 2);
    proc.Dispose();

Jetzt können Sie die memoryVariable verwenden, die in Megabyte konvertiert wird.


3
NB: Ein Megabyte ist 2 ^ 20 nicht 1e + 6
Hylaean

1
Eine Note. In C # ^ist bitweises XOR, keine Leistung. Also einfach benutzen proc.PrivateMemorySize64 / (1024*1024), oderproc.PrivateMemorySize64 / (1 << 20)
18ергей Рыбаков

Sie haben Klammern verpasst, sollte sein, proc.PrivateMemorySize64 / (1024 * 1024)da die Multiplikation keine Priorität vor der Division hat.
Laurynas Lazauskas

@LaurynasLazauskas Ich habe die Antwort aktualisiert. Vielen Dank.
Ahmad Payan

0

Für das gesamte System können Sie das Microsoft.VisualBasic Framework als Referenz hinzufügen.

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.