我运行以下代码
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
第三次执行后的情况是一样的。
为什么会这样?为什么在这种情况下不执行“紧凑”操作?
谢谢。
答案 0 :(得分:3)
GC很懒惰。它实际上不会自由,或者在你需要之前说“紧凑”。该对象已移至dispose队列。
你可以等几天,看不清楚。当资源很少且需要时它会清理。