gpt4 book ai didi

c# - 当我要求 dotMemory 强制垃圾收集时究竟会发生什么

转载 作者:行者123 更新时间:2023-12-03 14:44:48 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Gen2 collection not always collecting dead objects?

(6 个回答)



Understanding garbage collection in .NET

(2 个回答)


去年关闭。




我使用 dotMemory 来分析我的应用程序,我注意到以下行为:在我的代码中有一些地方我使用手动执行垃圾收集

GC.Collect();
GC.WaitForPendingFinalizers();

在 dotMemory 中,我看到内存实际上在这些点被释放,但如果之后我单击“强制 GC”,甚至会收集更多垃圾。他们这样做的方式是什么,为什么我的代码没有收集内存,是否有可能实现相同级别的收集?

我附上了截图,你可以看到第 2 代几乎被 dotMemory 减半 enter image description here

我还尝试执行多个集合,即
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();

即使它似乎回收了更多内存,它也永远无法接近 dotMemory 的性能

最佳答案

来自 JetBrain's Forum
:
“强制 GC”按钮从 native 代码调用 GC。
当您从代码中调用 GC.Collect() 方法时,它会执行以下步骤:
释放可立即释放的内存
找到具有 Finalize 方法的对象并将它们放入队列
GC.Collect() 只释放托管对象。此外,CLR 有几种不同的 GC 策略,它们根据情况应用以最小化导致 GC 的延迟,我们无法影响它。
如果托管对象没有 Finalize 方法或此方法未正确实现,则永远不会释放托管对象使用的 native 内存。
我们可以建议您使用 GC.Collect 调用 WaitForPendingFinalizers 方法并重复几次:

for (int i = 0; i < 4; i++)
{
GC.Collect(2, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();
}
它可以显示更好的结果,但我们不能保证此代码会导致与从 native 代码调用的 Full GC 相同的结果。
GC.Collect 方法: https://msdn.microsoft.com/en-us/library/hh138633(v=vs.110).aspx

关于c# - 当我要求 dotMemory 强制垃圾收集时究竟会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42022723/

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