gpt4 book ai didi

c# - 为什么这个内存没有被清理,或者根本没有被分配?

转载 作者:太空狗 更新时间:2023-10-30 00:35:54 27 4
gpt4 key购买 nike

所以,我得到了这个非常有用的很棒的程序:

static void Main(string[] args)
{
new Dictionary<int,int>(10000000);

while (true)
{
System.Threading.Thread.Sleep(1000);
}
}

编译器甚至没有发出任何警告,这令人惊讶。

运行它会分配一 block 内存。如果我运行多个副本,我最终会因为内存不足而无法再开始。

  1. 为什么垃圾收集器从来不清理内存,而是让系统进入没有足够内存供新进程使用的状态?
  2. 哎呀,为什么内存分配没有优化?它永远不能被任何东西引用!

那么这里发生了什么?

最佳答案

垃圾收集器是非确定性的,并且响应内存压力。如果没有什么需要内存,它可能暂时不会收集。它无法优化掉 new,因为这会更改您的代码:构造函数可能 有副作用。此外,在调试中,更有可能决定不收集。

在发布/优化的构建中,我会期望在有充分理由的某个时候收集它。还有 GC.Collect,但通常应避免使用,除非极端情况或某些分析需求。

作为“原因”——GC“世代”之间的 GC 行为存在差异;并且您在“大对象堆”(LOH)上有一些大数组。继续检查此 LOH 的成本非常高,这可以进一步解释为什么它如此不愿意。

关于c# - 为什么这个内存没有被清理,或者根本没有被分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3313655/

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