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.