C #에서 사용 가능하거나 사용되는 메모리를 얻는 방법


136

응용 프로그램에서 사용 가능한 RAM 또는 메모리를 어떻게 얻을 수 있습니까?


System.Diagnostics.Process수업을 살펴 봐야합니다 .
Ronald Wildenberg

3
현재 사용되는 물리적 RAM은 작업 세트이며, 할당 된 메모리는 개인 또는 공유 바이트에 속합니다 (할당 유형에 따라 다름).
Richard

답변:


172

당신이 사용할 수있는:

Process proc = Process.GetCurrentProcess();

현재 프로세스를 가져 와서 사용하려면 :

proc.PrivateMemorySize64;

개인 메모리 사용을 얻으려면. 자세한 내용은 이 링크 를 참조하십시오 .


52
GetCurrentProcess에 대한 호출 자체가 상당히 많은 리소스를 할당 할 것입니다. 완료되면 반환 된 프로세스에서 Dispose를 호출하거나 전체 코드를 "사용"범위로 묶습니다.
Mathias Lykkegaard Lorenzen

9
네임 스페이스 : System.Diagnostics 어셈블리 : System (System.dll)
Enigma Plus

12
또한 PrivateMemorySize64 속성 (+ 다른 속성) 자체가 Refresh ()가 호출 될 때까지 자동으로 업데이트되지 않는다고 덧붙이고 싶습니다. (위의 링크에서 페이지에 언급되어 있습니다.)
ScottRhee

1
자세한 답변은 다음의 다른 유사한 질문을 참조하십시오. stackoverflow.com/questions/14032515/…
Aaron D

1
@ScottRhee 내가 틀렸다면 나를 수정하십시오. 그러나 속성 값이 호출하는 순간에 "최신"이라고 추가하고 속성 GetCurrentProcess에 액세스하기 전에 다른 작업을 수행하는 경우에만 새로 고쳐야합니다. 출처 - 설명에 따르면 프로세스 스냅 샷이 생성되는 순간 속성이 정확하다고합니다.
tabjsina

38

GC.GetTotalMemory 메소드 를 점검 할 수 있습니다 .

가비지 수집기에서 현재 할당 할 것으로 생각되는 바이트 수를 검색합니다.


12
그러나 관리되는 힙에서만. Arkain의 대답은 기본 힙과 관리 힙을 모두 제공해야합니다.
Yaur


11

여기에 자세한 내용은.

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

}

값이 0이면 NextValue()두 번 호출해야합니다 . 그런 다음 실제 CPU 사용량 값을 제공합니다. 자세한 내용은 여기를 참조 하십시오 .


6

뿐만 아니라 @JesperFyhrKnudsen 의 대답과 @MathiasLykkegaardLorenzen 의 코멘트, 당신은 더 나은 것 dispose(가) 반환 Process사용 후.

따라서을 삭제하기 위해 스코프를 Process감싸 using거나 Dispose반환 된 프로세스 ( proc변수)를 호출 할 수 있습니다.

  1. using 범위:

    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. 또는 Dispose방법 :

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

이제 memory메가 바이트로 변환 된 변수를 사용할 수 있습니다 .


3
NB : 1 메가 바이트는 1 ^ 6가 아니라 2 ^ 20입니다
Hylaean

1
하나의 메모. C # ^에서는 비트가 아닌 XOR입니다. 따라서 proc.PrivateMemorySize64 / (1024*1024), 또는proc.PrivateMemorySize64 / (1 << 20)
Сергей Рыбаков

proc.PrivateMemorySize64 / (1024 * 1024)곱셈이 나누기보다 우선 순위가 없으므로 괄호를 놓쳤습니다 .
Laurynas Lazauskas

@LaurynasLazauskas 나는 대답을 업데이트했습니다. 감사.
Ahmad Payan

0

완전한 시스템을 위해 Microsoft.VisualBasic Framework를 참조로 추가 할 수 있습니다.

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.