I have a program that uses threads in C#. Is there a way to know programmatically the memory usage of the application? I want to limit the spawning of threads to say 10 megabytes of memory, how would I do that?
-
19The minute you start down the road to control memory is the minute you start making a mistake. If you have REQUIREMENTS for memory, don't use .NET. If you don't have requirements, stop worrying about memory. .NET manages memory better than you ever could. Stop it. Leave it alone. No. Bad. Stop.user1228– user12282009-04-16 12:36:35 +00:00Commented Apr 16, 2009 at 12:36
-
1I agree with Will. As long as your currently referenced objects are below 2 GBs of memory on 32 bit system, let the GC handle it.Steve– Steve2009-04-16 12:38:26 +00:00Commented Apr 16, 2009 at 12:38
-
1@Will: Why is this bad? If not .NET then what else would be used?AnthonyWJones– AnthonyWJones2009-04-16 12:48:40 +00:00Commented Apr 16, 2009 at 12:48
-
3@yoitsfrancis: OTH you have a service app that you want to prevent being a memory hog then you need to state that, I don't think that such a requirement is unreasonable and its not the job of the GC to limit demand for memory.AnthonyWJones– AnthonyWJones2009-04-16 13:12:17 +00:00Commented Apr 16, 2009 at 13:12
-
5I don't think he's trying to manage his memory in regards to making each thread 10Mb or less. I think he's trying to manage the number of spawned threads such that his process does not exceed 10Mb, which I think is a fair request. It's up to him to decide if his application warrants this.Joseph– Joseph2009-04-16 13:16:54 +00:00Commented Apr 16, 2009 at 13:16
4 Answers
If you want the memory of the entire running process and not on a per thread basis, how about:
// get the current process
Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
// get the physical mem usage
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;
There's a whole host of other process memory properties besides WorkingSet64 check out the "memory related" ones at the following link for the one that best suit
http://msdn.microsoft.com/en-us/library/system.diagnostics.process_properties.aspx
Comments
I'm with Will and Steve, don't do this unless you REALLY have to do it . . . that said . . .
if you really need to do it you can use the .Net Hosting APIs they're there so apps like SQL Server can host the .net framework within the application.
It gives you control over memory management etc, I've read the article but never used the API's, they're on my to-do list for some night when I'm bored and none of my other "fun" projects feel like fun that week :)
Hope this helps.
Comments
You don't measure the number of threads in memory usage. Rather, take into account the number of "processors" (SMP / Multi-Cores / Hyper-Threading) to decide how many threads should run in parallel. Or use the ThreadPool, which is sized automatically to achieve a good thread-to-CPU ratio.