gpt4 book ai didi

.net - .net 垃圾收集器何时不压缩 gc 堆?

转载 作者:行者123 更新时间:2023-12-01 02:38:26 24 4
gpt4 key购买 nike

我运行以下代码

        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

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

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

谢谢你。

最佳答案

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

你可以等几天,但看不到它清理干净。当资源不足并且需要时,它会进行清理。

关于.net - .net 垃圾收集器何时不压缩 gc 堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9173745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com