views:

36

answers:

1

We're in the middle of debugging some memory issues. We were watch 5 instances of the same app. We stopped 3. The Gen2 Heap size went from about 5M to almost 10M, and the Gen0 and Gen1 heap sizes changed insignificantly.

This is the exact opposite of what I'd expect. I expected it to reduce in size, and would never expect it to increase.

What is going on here?

More details: These are console apps, same physical .exe, different command lines, all doing simple "read file, insert to database" (or vice-versa) work.

We were running in to memory issues and couldn't find it so in desperation added a GC.Collect after each batch run. Doing the has alleviated the memory usage, but doesn't give a clue to what the root problem is.

@S.Skov, the GC heap sizes are all identical for every instance. When closing some of the apps, every single one that was still open had identical heap sizes. This is making us operate under the assumption that the GC was shared amongst all instances of the same program. We're using Process Explorer from sysinternals to measure the heap size.

tl;dr version: Memory usage was out of control. GC.Collect() "fixes" the symptom but not the problem. Also the GC Heap sizes are always identical amongst all instances of the same app.

apologies: I also may be doing a poor job at effectively transcribing our team's discussions and hand-waving in to something meaningful on the web.

+1  A: 

Are you sure you actually have a memory issue - i.e. do you run into out of memory errors or other 'leaky' stuff?

If GC.Collect() fixes the memory issue, then you do not have a problem. Garbage collections only happen when there is a need for it. Usually this means that Gen0 and Gen1 will be collected a lot (as these areas are small compared to Gen2 and LOH), but Gen2 and LOH will almost never be GCed unless you force it or the system pressures the app. Depending on what exactly you are allocating you might also see some full garbage collection runs that compact the various generation heap area, but doesn't really free any memory.

By design the .NET app will gobble up all the memory it can get it's greasy hands on, and only when the system tells it to stop and free some of it, will it do so.

S.Skov