gpt4 book ai didi

.NET 第 0 代堆大小

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

是否可以在 .NET 中设置第 0 代堆的最小大小?

我有以下情况。我有一个函数,它分配大约 20-30 MB 的 1KB 对象,对它们做一些事情,然后终止,让所有分配的对象都被 GC 处理。现在,在性能监视器中,我可以看到第 0 代堆大小为 5-6 MB,这不足以接受我需要的所有 20-30 MB 对象。当我开始分配时,在某个时候 gen0 GC 开始运行,并且由于需要所有对象,因此将它们提升到 gen1。下次 GC 开始运行时,这些对象会在 gen2 中得到提升。所以最后大约 15MB 的对象最终出现在 gen2 堆中。根据我的逻辑,这些是临时对象,绝不会在 gen2 堆中结束。我相信问题出在 gen0 堆大小的大小上。但我不确定。我知道在 Java 中可以设置最小的分代堆大小。 .NET 中有这样的方法吗?

最佳答案

不同代的大小是一个实现细节,我不知道有什么方法可以为 .NET 应用程序调整它。如果我没记错的话,第 0 代和第 1 代共享一个段,在 Win32 中为 16 MB,因此如果您确实创建了大量对象,如果它们仍然被引用(就像你描述)。

我想限制第 0 代的大小背后的想法是确保 g0 集合便宜。如果第 0 代可以增长到任何大小,您的整体性能很可能会受到影响。

编辑:我相信 Jeffrey Richter 的书对此有一些详细信息,因此您可能需要查看一下。

EDIT2:Richter 指出(第 502-507 页)第 0 代的初始预算为 256 KB,第 1 代的初始预算为 2 MB。然而,这不是一代人的规模。预算会根据需要进行调整,并且会根据应用程序的内存使用情况增加和减少。

然而,Joe Duffy 的 Professional .NET Framework 2.0 指出,临时代(即第 0 代和第 1 代)共享一个段,通常为 16 MB(第 117 页)。只有第 2 代允许根据需要增长(我认为 LOH 也可以根据需要增长,但我从文本中不清楚)。

关于.NET 第 0 代堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/834042/

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