Jak uzyskać dostępną lub używaną pamięć w C #

136

Jak mogę uzyskać dostępną pamięć RAM lub pamięć używaną przez aplikację?

johnnyRose
źródło
Powinieneś spojrzeć na System.Diagnostics.Processklasę.
Ronald Wildenberg
3
Uwaga: aktualnie używana fizyczna pamięć RAM jest zestawem roboczym, przydzielona pamięć przypada na bajty prywatne lub współdzielone (w zależności od rodzaju alokacji).
Richard

Odpowiedzi:

172

Możesz użyć:

Process proc = Process.GetCurrentProcess();

Aby uzyskać bieżący proces i użyć:

proc.PrivateMemorySize64;

Aby uzyskać prywatne wykorzystanie pamięci. Więcej informacji znajdziesz pod tym linkiem .

Jesper Fyhr Knudsen
źródło
52
Należy zapewne zauważyć, że wywołanie GetCurrentProcess samo przydzieli całkiem sporo zasobów. Wywołaj Dispose na zwróconym procesie po zakończeniu lub zawiń cały kod w zakres „using”.
Mathias Lykkegaard Lorenzen
9
Przestrzeń nazw: System.Diagnostics Assembly: System (w System.dll)
Enigma Plus
12
Chciałbym również dodać, że sama właściwość PrivateMemorySize64 (+ inne właściwości) nie jest automatycznie aktualizowana do momentu wywołania Refresh (). (Jest to wspomniane na stronie pod powyższym linkiem.)
ScottRhee
1
Zobacz to inne podobne pytanie, aby uzyskać więcej odpowiedzi: stackoverflow.com/questions/14032515/…
Aaron D
1
@ScottRhee popraw mnie, jeśli się mylę - ale dodałbym, że wartości właściwości są „aktualne” w momencie wywołania GetCurrentProcess, ale muszą zostać odświeżone tylko wtedy, gdy wykonujesz inne operacje przed uzyskaniem dostępu do właściwości. Źródło - uwagi mówią, że właściwości są poprawne w momencie tworzenia migawki procesu.
tabjsina
38

Możesz chcieć sprawdzić metodę GC.GetTotalMemory .

Pobiera liczbę bajtów, które są obecnie uważane za przydzielone przez moduł odśmiecania pamięci.

CMS
źródło
12
Jednak tylko w zarządzanych stosach. Odpowiedź Arkaina powinna dać zarówno natywne, jak i zarządzane stosy.
Yaur
25

System.Environment ma WorkingSet - 64-bitową liczbę całkowitą ze znakiem zawierającą liczbę bajtów pamięci fizycznej odwzorowanej na kontekst procesu.

Jeśli chcesz uzyskać dużo szczegółów, możesz skorzystać z opcji System.Diagnostics.PerformanceCounter , ale konfiguracja będzie wymagała nieco więcej wysiłku.

Austin
źródło
Czy możesz (lub ktoś w ogóle) podać przykład użycia PerformanceCounter, aby uzyskać dostępną / używaną pamięć systemu?
The Elemental of Creation
11

Zajrzyj tutaj po szczegóły.

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

}

Jeśli otrzymasz wartość równą 0, musisz zadzwonić NextValue()dwa razy. Następnie podaje rzeczywistą wartość użycia procesora. Zobacz więcej szczegółów tutaj .

DevT
źródło
6

Oprócz @JesperFyhrKnudsen „s odpowiedź i @MathiasLykkegaardLorenzen ” komentarzu s, lepiej disposezwrócony Processpo użyciu go.

Tak więc, aby pozbyć się Process, możesz umieścić go w usingzakresie lub wywołać Disposezwrócony proces ( proczmienną).

  1. using zakres:

    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. Lub Disposemetoda:

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

Teraz możesz użyć memoryzmiennej, która jest konwertowana na megabajt.

Ahmad Payan
źródło
3
Uwaga: jeden megabajt to 2 ^ 20, a nie 1e + 6
Hylaean
1
Jedna uwaga. W C # ^jest bitowe XOR, a nie potęga. Więc po prostu użyj proc.PrivateMemorySize64 / (1024*1024)lubproc.PrivateMemorySize64 / (1 << 20)
Сергей Рыбаков
Brakowało ci nawiasów, powinno być, proc.PrivateMemorySize64 / (1024 * 1024)ponieważ mnożenie nie ma pierwszeństwa przed dzieleniem.
Laurynas Lazauskas
@LaurynasLazauskas Zaktualizowałem odpowiedź. Dzięki.
Ahmad Payan
0

Aby uzyskać kompletny system, możesz dodać Microsoft.VisualBasic Framework jako odniesienie;

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
PodTech.io
źródło