Как получить доступ к памяти или использовать в C #

136

Как я могу получить доступную оперативную память или память, используемую приложением?

johnnyRose
источник
Вы должны взглянуть на System.Diagnostics.Processкласс.
Рональд Вильденберг
3
Обратите внимание, что физическая оперативная память, используемая в настоящее время, является рабочим набором, выделенная память делится на частные или общие байты (в зависимости от типа выделения).
Ричард

Ответы:

172

Ты можешь использовать:

Process proc = Process.GetCurrentProcess();

Чтобы получить текущий процесс и использовать:

proc.PrivateMemorySize64;

Чтобы получить частное использование памяти. Для получения дополнительной информации посмотрите эту ссылку .

Джеспер Фир Кнудсен
источник
52
Вероятно, следует отметить, что вызов GetCurrentProcess сам по себе выделит довольно много ресурсов. Вызовите Dispose для возвращаемого процесса, когда закончите, или оберните весь код в область использования.
Матиас Ликкегор Лоренцен,
9
Пространство имен: сборка System.Diagnostics: система (в System.dll)
Enigma Plus
12
Я также хотел бы добавить, что свойство PrivateMemorySize64 (+ другие свойства) само не обновляется автоматически, пока не будет вызван Refresh (). (Это упомянуто на странице по ссылке выше.)
ScottRhee
1
См. Этот другой похожий вопрос для получения дополнительных ответов: stackoverflow.com/questions/14032515/…
Аарон Д
1
@ ScottRhee поправьте меня, если я ошибаюсь - но я бы добавил, что значения свойств «актуальны» на момент вызова GetCurrentProcess, но их нужно обновлять, только если вы выполняете другие операции до доступа к свойствам. Источник - Замечания говорят, что свойства являются правильными в момент создания снимка процесса.
Табьсина
38

Возможно, вы захотите проверить метод GC.GetTotalMemory .

Он извлекает количество байтов, которые в данный момент считаются выделенными сборщиком мусора.

CMS
источник
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()дважды. Затем он дает фактическое значение использования процессора. Смотрите подробности здесь .

DevT
источник
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
Примечание: один мегабайт равен 2 ^ 20, а не 1e + 6
Hylaean
1
Одна запись. В C # ^это битовый XOR, а не power. Так что просто пользуйтесь proc.PrivateMemorySize64 / (1024*1024), илиproc.PrivateMemorySize64 / (1 << 20)
Сергей Рыбаков
Вы пропустили скобки, должно быть, так proc.PrivateMemorySize64 / (1024 * 1024)как умножение не имеет приоритета над делением.
Лауринас Лазаускас
@LaurynasLazauskas Я обновил ответ. Спасибо.
Ахмад Паян
0

Для полной системы вы можете добавить Microsoft.VisualBasic Framework в качестве ссылки;

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
PodTech.io
источник