4

我运行以下代码

        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

第三次执行后的情况也是如此。

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

谢谢你。

4

1 回答 1

3

GC 懒得提高效率。在需要之前,它实际上不会免费或如您所说的“紧凑”。对象已移至处置队列。

您可以等待几天而看不到它清理干净。它会在资源不足且需要时进行清理。

于 2012-02-07T09:29:36.803 回答