Cómo obtener memoria disponible o utilizada en C #

136

¿Cómo puedo obtener la RAM o memoria disponible utilizada por la aplicación?

johnnyRose
fuente
Deberías echar un vistazo a la System.Diagnostics.Processclase.
Ronald Wildenberg el
3
Tenga en cuenta que la RAM física utilizada actualmente es el conjunto de trabajo, la memoria asignada cae en bytes privados o compartidos (según el tipo de asignación).
Richard el

Respuestas:

172

Puedes usar:

Process proc = Process.GetCurrentProcess();

Para obtener el proceso actual y usar:

proc.PrivateMemorySize64;

Para obtener el uso de memoria privada. Para más información mira este enlace .

Jesper Fyhr Knudsen
fuente
52
Probablemente debería tenerse en cuenta que una llamada a GetCurrentProcess asignará muchos recursos. Llame a Dispose en el proceso devuelto cuando haya terminado, o envuelva todo el código en un ámbito de "uso".
Mathias Lykkegaard Lorenzen
9
Espacio de nombres: System.Diagnostics Assembly: System (en System.dll)
Enigma Plus
12
También me gustaría agregar que la propiedad PrivateMemorySize64 (+ otras propiedades) en sí misma no se actualiza automáticamente hasta que se llame a Refresh (). (Se menciona en la página en el enlace de arriba.)
ScottRhee
1
Vea esta otra pregunta similar para obtener más respuestas: stackoverflow.com/questions/14032515/…
Aaron D
1
@ScottRhee corrígeme si estoy equivocado, pero agregaría que los valores de las propiedades están "actualizados" en el momento en que llamas GetCurrentProcess, pero solo necesitas actualizarlos si estás haciendo otras operaciones antes de acceder a las propiedades. Fuente : las observaciones dicen que las propiedades son correctas en el momento en que se crea la instantánea del proceso.
tabjsina
38

Es posible que desee comprobar el GC.GetTotalMemory método .

Recupera el número de bytes que el recolector de basura cree actualmente asignados.

CMS
fuente
12
Sin embargo, solo en montones gestionados. La respuesta de Arkain debería dar montones nativos y manejados.
Yaur
25

System.Environment tiene WorkingSet : un entero con signo de 64 bits que contiene la cantidad de bytes de memoria física asignada al contexto del proceso.

Si desea muchos detalles, hay System.Diagnostics.PerformanceCounter , pero será un poco más difícil de configurar.

Austin
fuente
¿Puede usted (o alguien en absoluto) dar un ejemplo de cómo usar PerformanceCounter para obtener el sistema disponible / memoria usada?
The Elemental of Creation
11

Mira aquí para más detalles.

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

}

Si obtiene el valor 0, debe llamar NextValue()dos veces. Luego da el valor real del uso de la CPU. Ver más detalles aquí .

DevT
fuente
6

Además de @JesperFyhrKnudsen 's respuesta y @MathiasLykkegaardLorenzen comentario' s, es mejor que disposelos RetornadosProcess después de usarlo.

Entonces, para deshacerse de él Process, puede envolverlo en un usingámbito o invocar Disposeel proceso devuelto ( procvariable).

  1. using alcance:

    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 Disposemétodo:

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

Ahora podría usar la memoryvariable que se convierte a Megabyte.

Ahmad Payan
fuente
3
NB: Un megabyte es 2 ^ 20 no 1e + 6
Hylaean
1
Una nota. En C # ^es XOR bit a bit, no potencia. Así que solo use proc.PrivateMemorySize64 / (1024*1024), oproc.PrivateMemorySize64 / (1 << 20)
Сергей Рыбаков
Te perdiste el paréntesis, debe ser proc.PrivateMemorySize64 / (1024 * 1024)como la multiplicación no tiene prioridad sobre la división.
Laurynas Lazauskas
@LaurynasLazauskas He actualizado la respuesta. Gracias.
Ahmad Payan
0

Para el sistema completo, puede agregar Microsoft.VisualBasic Framework como referencia;

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
PodTech.io
fuente