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

136

Como posso obter a RAM ou memória disponível usada pelo aplicativo?

johnnyRose
fonte
Você deve dar uma olhada na System.Diagnostics.Processclasse.
Ronald Wildenberg
3
Observe que a RAM física usada atualmente é o conjunto de trabalho, a memória alocada cai em bytes privados ou compartilhados (dependendo do tipo de alocação).
Richard

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 .

Jesper Fyhr Knudsen
fonte
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.

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

System.Environment possui WorkingSet - um número inteiro assinado de 64 bits que contém o número de bytes de memória física mapeada para o contexto do processo.

Se você deseja muitos detalhes, há System.Diagnostics.PerformanceCounter , mas será um pouco mais difícil de configurar.

Austin
fonte
Você pode (ou alguém) dar um exemplo de como usar o PerformanceCounter para disponibilizar / utilizar a memória do sistema?
The Elemental of Creation
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 .

DevT
fonte
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.

Ahmad Payan
fonte
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();
PodTech.io
fonte