什么时候.net垃圾收集器不压缩gc堆?

时间:2012-02-07 09:24:39

标签: .net clr garbage

我运行以下代码

        StringBuilder sb = new StringBuilder();
        Stack  stack = new Stack();
        SynchronizationContext sc = new SynchronizationContext();

        GC.Collect();
        Console.WriteLine("GC. First Execution.");

        stack = null;

        GC.Collect();
        Console.WriteLine("GC. Second Execution.");

        GC.Collect();
        Console.WriteLine("GC. Third Execution.");

使用SOS调试此代码时,我会看到首次执行GC地址后:

!dso
...
0239b5f8 System.Threading.SynchronizationContext
0239b5a8 System.Collections.Stack
0239b560 System.Text.StringBuilder
...

第二次执行后,堆中没有'stack'对象,但其他地址是:

!dso
...
0239b5f8 System.Threading.SynchronizationContext
0239b560 System.Text.StringBuilder
...

因此收集了'stack'对象,但是sc(SynchronizationContext)对象没有重新定位在要压缩的内存中。我们的记忆存在差距

!do 0239b5a8
Free Object
Size:        80(0x50) bytes

第三次执行后的情况是一样的。

为什么会这样?为什么在这种情况下不执行“紧凑”操作?

谢谢。

1 个答案:

答案 0 :(得分:3)

GC很懒惰。它实际上不会自由,或者在你需要之前说“紧凑”。该对象已移至dispose队列。

你可以等几天,看不清楚。当资源很少且需要时它会清理。