gpt4 book ai didi

c# - 本地对象的垃圾收集

转载 作者:行者123 更新时间:2023-11-30 14:06:43 25 4
gpt4 key购买 nike

我写了一个小型控制台应用实验:

static void Main()
{
int GetTotalCollections()
{
var total = 0;

for (var generation = 0; generation <= GC.MaxGeneration; generation++)
total += GC.CollectionCount(generation);

return total;
}

CreateGarbage();

WriteLine("Number of collections occurred: {0}", GetTotalCollections());
}

static void CreateGarbage()
{
WriteLine(new object().GetHashCode());
WriteLine(new object().GetHashCode());
WriteLine(new object().GetHashCode());
ReadKey();
}

当我在没有附加调试器的情况下以 Release 模式运行它时,我得到了所有世代的 0 集合。

因为这看起来很奇怪,所以我将 WinDbg 附加到进程中,!dumpheap -live 不显示对象,而 !dumpheap 显示对象。不幸的是,-live 不是 SOS 官方文档的一部分,但我假设它只显示未收集的对象。

GC 是在收集而不是报告它(在这种情况下应该如此)还是我误解了 !dumpheap -live 输出? (也许只显示具有 GC root 的对象?)

如果我分配更多对象以确保我触发一个集合(或调用 GC.Collect),我会得到一个集合计数增加,但 WinDbg 中的输出仍然相同:

static void GetValue()
{
for (var i = 0; i < 1000000; i++)
new object();

ReadKey();
}

编辑:最后一句话是一个疏忽(造成了困惑),如果我强制收集,!dumpheap -stat 不再按预期显示对象(我只是忘了运行在按下某个键以强制收集之前,来自 WinDbg 的应用程序。)

!dumpheap -stat 显示未收集的对象,包括活的和死的,!dumpheap -stat -live 仅显示具有 GC root 的对象@Thomas 回答。一旦收集起来,它们就会从所有命令的输出中消失。

最佳答案

不,GC 不收集也不报告它,它只是还没有运行任何收集。仅仅因为您创建了一些有资格收集的对象并不意味着任何收集实际上已经发生,只是收集发生时,这些对象将被清理靠它。根据大量启发式算法,GC 实际上会在它认为需要的时候运行。

关于c# - 本地对象的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45719887/

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