Як отримати пам'ять доступною або використаною в C #


136

Як я можу отримати доступну оперативну пам’ять або пам'ять, яку використовує додаток?


Слід поглянути на System.Diagnostics.Processклас.
Рональд Вільденберг

3
Зауважте, що фізична оперативна пам’ять, яка зараз використовується, є робочим набором, виділена пам'ять підпадає під приватні або загальні байти (залежно від типу розподілу).
Річард

Відповіді:


172

Ви можете використовувати:

Process proc = Process.GetCurrentProcess();

Щоб отримати поточний процес і скористайтеся:

proc.PrivateMemorySize64;

Щоб отримати приватну пам'ять. Для отримання додаткової інформації дивіться це посилання .


52
Напевно, слід зазначити, що виклик GetCurrentProcess сам по собі виділить досить багато ресурсів. Завершіть виклик розпоряджатися поверненим процесом, або заверніть весь код в області "використання".
Mathias Lykkegaard Lorenzen

9
Простір імен: Асамблея System.Diagnostics: System (в System.dll)
Enigma Plus

12
Хочеться також додати, що властивість PrivateMemorySize64 (+ інші властивості) сама по собі не оновлюється автоматично до виклику Refresh (). (Про це згадується на сторінці за посиланням вище.)
ScottRhee

1
Дивіться це інше подібне запитання для отримання додаткових відповідей: stackoverflow.com/questions/14032515/…
Аарон D

1
@ScottRhee виправте мене, якщо я помиляюся - але я додам, що значення властивостей "актуальні" на момент виклику GetCurrentProcess, але їх потрібно оновити лише в тому випадку, якщо ви робите інші операції до доступу до ресурсів. Джерело - Зауваження стверджують, що властивості є правильними на момент створення знімка процесу.
tabjsina

38

Ви можете перевірити метод GC.GetTotalMemory .

Він отримує кількість байтів, які, на сьогоднішній день, як вважається, видає сміттєзбірник.


12
Тільки в керованих купи хоча. Відповідь Аркаїна повинна дати як рідному, так і керованому купи.
Яур

25

System.Environment має WorkingSet - 64-бітове ціле число, підписане, що містить кількість байтів фізичної пам'яті, відображених у контексті процесу.

Якщо ви хочете багато деталей, є System.Diagnostics.PerformanceCounter , але це буде трохи більше зусиль для налаштування.


Чи можете ви (чи хтось взагалі) навести приклад того, як використовувати PerformanceCounter, щоб отримати доступну / використану пам'ять системи?
Елементал творення

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()двічі. Тоді воно дає фактичне значення використання процесора. Детальніше дивіться тут .


6

На додаток до @JesperFyhrKnudsen «s відповідь і @MathiasLykkegaardLorenzen » s коментар, ви б краще 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: Один мегабайт - 2 ^ 20, а не 1е + 6
Гілайський

1
Одна примітка. У C # ^побітовий XOR, а не потужність. Тому просто використовуйте proc.PrivateMemorySize64 / (1024*1024)абоproc.PrivateMemorySize64 / (1 << 20)
Сергій Рибаков

Ви пропустили дужки, повинно бути, proc.PrivateMemorySize64 / (1024 * 1024)оскільки множення не має пріоритету перед діленням.
Laurynas Lazauskas

@LaurynasLazauskas Я оновив відповідь. Дякую.
Ахмад Паян

0

Для повної системи можна додати Microsoft.VisualBasic Framework в якості посилання;

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.