views:

364

answers:

4

How to measure the total memory consumption of the current process programatically in .NET?

+3  A: 

PerformanceCounter class -

http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.aspx

There are several of them -

http://msdn.microsoft.com/en-us/library/w8f5kw2e.aspx

Here is the CLR memory counter -

http://msdn.microsoft.com/en-us/library/x2tyfybc.aspx

Kris Krause
I find this counters confusing. Example: "# Total reserved Bytes" : "Displays the amount of virtual memory. in bytes, currently reserved by the garbage collector." Then I wonder? Is this about the process memory or about the memory that will be collected soon?
Jader Dias
`new PerformanceCounter("Process", "Private Bytes", "ConsoleApplication1.vshost").RawValue` looks promising
Jader Dias
+1  A: 

Refer to this SO question

Further try this

Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;
HotTester
Accordingly to this blog http://blogs.msdn.com/salvapatuel/archive/2007/10/13/memory-working-set-explored.aspx Working set != Total process memory
Jader Dias
But in my tests the WorkingSet64 value is very very very close to the one shown by the TaskManager
Jader Dias
@Jader Dias - this answer captures the essence of what is required (use of the System.Diagnostics.Process type) but be wary of what the garbage collector may or may not be doing otherwise you may end up with highly misleading results - I show how to avoid this problem in my answer
AdamRalph
+2  A: 

If you only want to measure the increase in say, virtual memory usage, caused by some distinct operations you can use the following pattern:-

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

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

// performs operations here

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

This is, of course, assuming that your application in not performing operations on other threads whilst the above operations are running.

You can replace VirtualMemorySize64 with whatever other metric you are interested in. Have a look at the System.Diagnostics.Process type to see what is available.

AdamRalph
A: 

I have found this very useful:

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;
Jader Dias