Come ottenere memoria disponibile o utilizzata in C #


Risposte:


172

Puoi usare:

Process proc = Process.GetCurrentProcess();

Per ottenere il processo corrente e utilizzare:

proc.PrivateMemorySize64;

Per ottenere l'utilizzo della memoria privata. Per maggiori informazioni guarda questo link .


52
Dovrebbe probabilmente essere notato che una chiamata a GetCurrentProcess assegnerà essa stessa molte risorse. Al termine, chiamare Dispose sul processo restituito oppure avvolgere l'intero codice in un ambito "utilizzo".
Mathias Lykkegaard Lorenzen,

9
Spazio dei nomi: System.Diagnostics Assembly: System (in System.dll)
Enigma Plus

12
Vorrei anche aggiungere che la proprietà PrivateMemorySize64 (+ altre proprietà) non viene automaticamente aggiornata fino a quando non viene chiamato Refresh (). (È menzionato nella pagina al link sopra.)
ScottRhee

1
Vedi questa altra domanda simile per ulteriori risposte: stackoverflow.com/questions/14032515/…
Aaron D

1
@ScottRhee correggimi se sbaglio, ma aggiungerei che i valori della proprietà sono "aggiornati" al momento della chiamata GetCurrentProcess, ma devono essere aggiornati solo se stai facendo altre operazioni prima di accedere alle proprietà. Origine : le osservazioni indicano che le proprietà sono corrette al momento della creazione dell'istantanea del processo.
tabjsina,

38

Potresti voler controllare il metodo GC.GetTotalMemory .

Recupera il numero di byte attualmente ritenuti assegnati dal Garbage Collector.


12
Solo in cumuli gestiti però. La risposta di Arkain dovrebbe dare cumuli sia nativi che gestiti.
Yaur,


11

Guarda qui per i dettagli.

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);

}

Se si ottiene un valore pari a 0, è necessario chiamare NextValue()due volte. Quindi fornisce il valore effettivo dell'utilizzo della CPU. Vedi maggiori dettagli qui .


6

Oltre a @JesperFyhrKnudsen 'risposta s e @MathiasLykkegaardLorenzen commento' s, è meglio disposerestituitaProcess dopo l'uso.

Quindi, per smaltire il Process, è possibile inserirlo in un usingambito o richiamare Disposeil processo restituito ( procvariabile).

  1. using scopo:

    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. O Disposemetodo:

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

Ora puoi usare la memoryvariabile che viene convertita in Megabyte.


3
NB: Un megabyte è 2 ^ 20 non 1e + 6
Hylaean,

1
Una nota. In C # ^è XOR bit a bit, non potenza. Quindi basta usare proc.PrivateMemorySize64 / (1024*1024), oproc.PrivateMemorySize64 / (1 << 20)
Сергей Рыбаков

Hai perso la parentesi, dovrebbe essere proc.PrivateMemorySize64 / (1024 * 1024)come moltiplicazione non ha una priorità sulla divisione.
Laurynas Lazauskas,

@LaurynasLazauskas Ho aggiornato la risposta. Grazie.
Ahmad Payan,

0

Per il sistema completo è possibile aggiungere Microsoft.VisualBasic Framework come riferimento;

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.