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


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 .


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.


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.


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 .


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.


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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.