Cómo obtener memoria disponible o utilizada en C #


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 .


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.


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


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í .


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.


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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.