How to measure the total memory consumption of the current process programatically in .NET?
views:
364answers:
4
+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 -
Kris Krause
2010-02-26 13:52:43
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
2010-02-26 14:06:44
`new PerformanceCounter("Process", "Private Bytes", "ConsoleApplication1.vshost").RawValue` looks promising
Jader Dias
2010-02-26 14:16:38
+1
A:
Refer to this SO question
Further try this
Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;
HotTester
2010-02-26 13:53:25
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
2010-02-26 14:00:53
But in my tests the WorkingSet64 value is very very very close to the one shown by the TaskManager
Jader Dias
2010-02-26 14:03:12
@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
2010-02-26 14:06:49
+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
2010-02-26 14:00:17
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
2010-03-22 17:05:31