The Setup
.NET allocates memory for each generation’s heap (0, 1, 2, LOH) in segments to get a continuous block of memory, on startup, and when it a
I don't know the answer to this, but I suspect that .NET doesn't release its heaps until the process exits (and possibly on unloading an AppDomain, at a guess). This is only based on my watching the perfmon .NET Memory counters. The GC total bytes counters shows, at least in my app, that the Reserved bytes go up and down a little over the life of my app, like about 30MB.
And, if the GC is running in the server mode, perhaps .NET releases memory more often.