CLR 4.0中的垃圾收集改进

时间:2011-03-23 23:33:22

标签: c# .net clr clr4.0

最近我运行了针对.NET 4编译的Andrew Hunter on his blog "The Dangers of the Large Object Heap"提供的示例,我得到了以下数字:

  

使用大块:分配622Mb   有大块,经常乱垃圾   集合:582Mb分配
仅   小块:1803Mb分配
用   大块,大块没有   增长:630Mb分配

如果针对.NET 2.0编译相同的代码,我几乎得到了文章中提到的数字:

  

使用大块:分配21Mb   有大块,经常乱垃圾   收藏:26Mb分配
只有小   块:1811Mb分配
用大   块,大块没有增长:   707Mb分配

这种戏剧性改善的原因是什么?

代码是针对x86平台编译的,并且在Windows 7上运行

3 个答案:

答案 0 :(得分:4)

CLR团队需要做的一些工作是改进的原因,但显然还有改进的余地:

http://mitch-wheat.blogspot.com/2010/11/net-clr-large-object-heap.html

答案 1 :(得分:4)

有些事情发生了变化,但这是一个保守的秘密,我什么都找不到。我不会把太多的股票投入其中。手动调整代码示例使CLR 2大对象堆看起来尽可能糟糕。即使算法的微小变化(可能受到博客文章的启发)也会产生非常大的影响。

答案 2 :(得分:2)

我可以想到微软本可以对内存分配器做一些简单的事情,这样可以大大减少LOH碎片而不需要进行大修,例如将分配大小舍入到4K等多个分区。鉴于最小的非静态LOH对象是85K,这将最多占用有用空间的5%,但会减少不同大小的对象和间隙的数量。顺便说一下,我真的不相信强迫所有大型物体进入LOH的价值(相反,或许,有一种方法可以指定何时创造一个物体,无论它是否应该转到LOH)。一旦达到第2级,我就能理解将小物体与大物体分开的一些价值,但是有足够多的情况下,大物体被创造和放弃,迫使它们达到2级似乎适得其反。