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?

johnnyRose
quelle
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 .

Jesper Fyhr Knudsen
quelle
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.

CMS
quelle
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.

Austin
quelle
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 .

DevT
quelle
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.

Ahmad Payan
quelle
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();
PodTech.io
quelle