How to measure the total memory consumption of the current process programmatically in .NET?
Asked
Active
Viewed 6.8k times
69
4 Answers
65
Refer to this SO question
Further try this
Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;
-
7Accordingly to this blog http://blogs.msdn.com/salvapatuel/archive/2007/10/13/memory-working-set-explored.aspx Working set != Total process memory – Jader Dias Feb 26 '10 at 14:00
-
1But in my tests the WorkingSet64 value is very very very close to the one shown by the TaskManager – Jader Dias Feb 26 '10 at 14:03
-
@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 – Adam Ralph Feb 26 '10 at 14:06
40
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.

Ofer Zelig
- 17,068
- 9
- 59
- 93

Adam Ralph
- 29,453
- 4
- 60
- 67
-
2
-
7The first time, objects are put on the freachable queue and are later finalized. Afterwards, they are collectable. – Adam Ralph Jan 22 '16 at 15:55
3
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 -

Kris Krause
- 7,304
- 2
- 23
- 26
-
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 Feb 26 '10 at 14:06
-
1`new PerformanceCounter("Process", "Private Bytes", "ConsoleApplication1.vshost").RawValue` looks promising – Jader Dias Feb 26 '10 at 14:16
0
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
- 88,211
- 155
- 421
- 625
-
19Sigh... Just so anyone reading this isn't confused...You only provided code for one thread, so the MemoryBarrier calls are beyond useless (and there's no multi-threaded version of this where those would make any sense, either). I'm not sure what you think those do, but it's not what they actually do. – Brandon Paddock Feb 05 '15 at 07:48