什么是#34;正常"用于CLR GC的生成堆大小?

时间:2014-12-23 14:20:19

标签: .net garbage-collection clr .net-4.5

可能没有答案。

分析一些代码,我注意到Gen1堆大小是250MB,然后在单个Gen0集合之后,它上升到518MB。 因此Gen0在收集之前达到了250MB。

我一直认为Gen0和Gen1(尽管它们不是固定的并且可以变化)比这个要小得多。

对于不同世代的预期尺寸范围,我们能说些什么吗?

(这是在具有8GB Ram,.Net 4.5.2的机器上的Workstation GC下。我们实际上正在测量MSTest / QTAgent下的代码,这可能会影响GC的执行方式)

1 个答案:

答案 0 :(得分:1)

我搜索了一下,发现了许多关于每一代初始尺寸的说法,但他们每个都声称不同的数字。可以安全地假设它从低位开始并根据分配和集合而改变大小。但你已经知道了。

没有什么比#"正常"世代大小。如果你分配了许多小对象并且不能让它们保持太长时间,那么Gen0的大小会保持较低,并且集合会更频繁地发生,但速度非常快。但是,如果您分配的对象较少但尺寸较大,则Gen0大小可能会增加,并且集合的发生频率会降低。

在这种情况下,你应该关注这些数字的情况并不多。如果你想分析这些世代如何改变它们的大小,运行像DotTrace这样的东西并观察大小增加之前的内容,也许你将能够分辨出什么方法/链调用/ ......引起它。