2010-02-26 3 views

ответ

41

Обратитесь к этому SO question

Далее попробуйте этот

Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); 
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64; 
+5

Соответственно этому блогу http://blogs.msdn.com/salvapatuel/archive/2007/10/13/ memory-working-set-explored.aspx Рабочий набор! = Общая память процесса –

+1

Но в моих тестах значение WorkSet64 очень очень близко к показателю TaskManager –

+0

@Jader Dias - этот ответ отражает суть требуемого (использование типа System.Diagnostics.Process), но будьте осторожны с тем, что сборщик мусора может или не может сделать иначе, вы можете в конечном итоге получить очень вводящие в заблуждение результаты - я покажу, как избежать этой проблемы в моем ответе –

3
+0

Я нахожу это счетчики запутанным. Пример: «# Всего зарезервированных байтов»: «Отображает количество виртуальной памяти в байтах, в настоящее время зарезервированное сборщиком мусора». Тогда интересно? Это о памяти процесса или о памяти, которая будет собрана в ближайшее время? –

+0

'new PerformanceCounter (« Процесс »,« Частные байты »,« ConsoleApplication1.vshost »). RawValue выглядит многообещающе –

28

Если вы хотите измерить рост, скажем, использование виртуальной памяти, вызванные некоторыми различными операциями, которые можно использовать следующую схему: -

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 

var before = System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64; 

// performs operations here 

var after = System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64; 

Это, конечно, предполагает, что ваше приложение не выполняет операции над другими потоками, пока выполняются вышеуказанные операции.

Вы можете заменить VirtualMemorySize64 на любой другой показатель, который вас интересует. Посмотрите на тип System.Diagnostics.Process, чтобы увидеть, что доступно.

+0

Почему необходимо вызвать GC.Collect два раза? – Viru

+4

В первый раз объекты помещаются в freachable queue и позже завершаются. Впоследствии они собираются. –

+0

Спасибо @AdamRalph – Viru

2

Я нашел это очень полезно:

Thread.MemoryBarrier(); 
var initialMemory = System.GC.GetTotalMemory(true); 
// body 
var somethingThatConsumesMemory = Enumerable.Range(0, 100000) 
    .ToArray(); 
// end 
Thread.MemoryBarrier(); 
var finalMemory = System.GC.GetTotalMemory(true); 
var consumption = finalMemory - initialMemory; 
+10

Sigh ... Просто так, чтобы кто-нибудь, читающий это, не путался ... Вы только предоставили код для одного потока, поэтому вызовы MemoryBarrier оказались бесполезными (и нет многопоточной версии этого, любой смысл). Я не уверен, что вы думаете об этом, но это не то, что они на самом деле делают. –

Смежные вопросы