我运行以下代码
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
...
在第二次执行之后,堆中没有“堆栈”对象,但其他地址是:
!dso
...
0239b5f8 System.Threading.SynchronizationContext
0239b560 System.Text.StringBuilder
...
因此收集了“堆栈”对象,但 sc (SynchronizationContext) 对象没有重新定位到要压缩的内存中。我们的记忆中有一个缺口
!do 0239b5a8
Free Object
Size: 80(0x50) bytes
第三次执行后的情况也是如此。
为什么会这样?为什么在这种情况下不执行“紧凑”操作?
谢谢你。