Como obter memória disponível ou usada em C #


Respostas:


172

Você pode usar:

Process proc = Process.GetCurrentProcess();

Para obter o processo atual e usar:

proc.PrivateMemorySize64;

Para obter o uso de memória privada. Para mais informações, consulte este link .


52
Provavelmente, deve-se notar que uma chamada para GetCurrentProcess por si mesma alocará muitos recursos. Chamada Dispose no processo retornado quando terminar ou agrupe o código inteiro em um escopo "using".
Mathias Lykkegaard Lorenzen

9
Namespace: System.Diagnostics Assembly: System (em System.dll)
Enigma Plus

12
Gostaria de acrescentar também que a propriedade PrivateMemorySize64 (+ outras propriedades) em si não é atualizada automaticamente até que Refresh () seja chamado. (É mencionado na página no link acima.)
ScottRhee

1
Veja esta outra pergunta semelhante para obter mais respostas: stackoverflow.com/questions/14032515/…
Aaron D

1
@ScottRhee me corrija se estiver errado - mas eu acrescentaria que os valores da propriedade estão "atualizados" no momento em que você chama GetCurrentProcess, mas só precisam ser atualizados se você estiver executando outras operações antes de acessar as propriedades. Origem - Comentários dizem que as propriedades estão corretas no momento em que o instantâneo do processo é criado.
tabjsina

38

Convém verificar o método GC.GetTotalMemory .

Ele recupera o número de bytes atualmente considerados alocados pelo coletor de lixo.


12
Apenas em pilhas gerenciadas, no entanto. A resposta de Arkain deve fornecer pilhas nativas e gerenciadas.
Yaur


11

Veja aqui detalhes.

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 você obtiver o valor 0, precisará chamar NextValue()duas vezes. Em seguida, fornece o valor real do uso da CPU. Veja mais detalhes aqui .


6

Além @JesperFyhrKnudsen 'resposta s e @MathiasLykkegaardLorenzen ' comentário s, é melhor disposeo retornou Processapós usá-lo.

Portanto, para descartar o Process, você pode agrupá-lo em um usingescopo ou chamar Disposeo processo retornado ( procvariável).

  1. using escopo:

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

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

Agora você pode usar a memoryvariável que é convertida em Megabyte.


3
NB: Um megabyte é 2 ^ 20 e não 1e + 6
Hylaean 24/06

1
Uma nota. Em c #^ é bit XOR, não energia. Então, basta usar proc.PrivateMemorySize64 / (1024*1024), ouproc.PrivateMemorySize64 / (1 << 20)
Сергей Рыбаков

Você perdeu o parêntese, deve ser proc.PrivateMemorySize64 / (1024 * 1024)porque a multiplicação não tem prioridade sobre a divisão.
Laurynas Lazauskas

@LaurynasLazauskas Atualizei a resposta. Obrigado.
Ahmad Payan

0

Para o sistema completo, você pode adicionar o Microsoft.VisualBasic Framework como referência;

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.