gpt4 book ai didi

c# - windbg "Free"对象类型

转载 作者:太空狗 更新时间:2023-10-29 18:23:44 25 4
gpt4 key购买 nike

在我的程序运行时监视它的虚拟字节使用情况表明,通过执行某种操作,虚拟字节使用量在大约 5 分钟内增加了大约 1GB。该程序处理 tcp 套接字和它们之间的高数据传输吞吐量(~800Mbps)。

在 windbg 中加载该程序的转储文件表明,内存使用率非常高且速度很快的原因是大约 1GB 的“空闲”对象。事实上,当我从程序的控制台屏幕调用垃圾收集器(第 0、1 和 2 代)时(在进入此状态后),它释放了大约 1GB 的内存使用量。

我试图了解这些免费对象到底是什么,以及为什么垃圾收集器不自动收集它们。

编辑:一个建议是我可能在大对象堆中创建对象并且它变得碎片化,但事实并非如此,因为我已经看到所有“自由”对象位于第 2 代堆中。

其他建议是第 2 代堆可能因为固定对象而变得碎片化,但如果是这种情况,GC.Collect 不会解决问题,但它确实解决了问题,我相信情况也并非如此。

根据与 Paul 的讨论,我怀疑内存确实被释放了,但出于某种原因很少或仅在我手动调用 GC.Collect 时返回给操作系统。

最佳答案

它们不是自由的“对象”,它们是自由空间。 .NET 不会立即将已使用的内存释放回操作系统。任何空闲 block 都可以用于后续的对象分配,前提是它们适合空闲 block (否则必须通过要求操作系统分配更多内存来扩展堆)。

垃圾收集器努力通过压缩第 2 代将空闲空间组合成大的可用 block 。这并不总是可能的:例如,应用程序可能会固定对象,这可能会阻止垃圾收集器通过移动事件对象来组合空闲空间到堆的前面。如果这种情况经常发生,应用程序的内存将被分解成无用的小块,这种影响称为“堆碎片”。

此外,还有一个大型对象堆 (LOH),其中分配了较大的对象。理由是堆压缩会产生成本,因为数据必须四处复制,因此 LOH 不会被压缩,从而避免了这些成本。然而,不利的一面是,LOH 很容易变得碎片化,小的、不太有用的空闲内存块散布在事件对象之间。

我建议运行 dumpheap -stat。此命令将在列表末尾报告任何碎片 block 。然后,您可以转储这些 block 以了解正在发生的事情。

关于c# - windbg "Free"对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3557820/

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