2011-06-14 38 views
1

如果存在带有4M +节点的链接列表,标记阶段是否需要每次遍历整个列表以构建图表?在这种情况下是否有任何优化?显而易见,它看起来效率不高。有没有办法来验证GC是否遍历整个列表?.Net垃圾回收标记阶段和巨大的链接列表

TIA。

回答

2

是的,它需要遍历整个对象图。说实话,我不认为可以进行任何优化,但它不需要在每个节点上做太多的事情。大多数时间可能会花费在内存上,我怀疑它很可能会花在缓存上。当然,在链接列表以gen2结尾的时候(如果你分配了数百万个节点,其中大部分将会很快地在gen2中),但它只需要很少这样做。

如果这是您的应用程序最合理的数据结构,我会暂时使用它,但使用性能监视器跟踪垃圾收集的性能影响等。如果事实证明是一个问题,您可以考虑替代策略。

2

乔恩说什么。另外,一旦对象在Gen2中结束,可用的优化(在Windows上,但不在其他平台IIRC上)是GC可以向内核注册以通知给定的内存页。在GC事件之间页面保持不变的情况下,有些工作不需要重复。

2

有一个非常重要的优化正在进行。 .NET GC是世代的,gen2中的数据很少被遍历。由于大数据结构(如巨大的链接列表),大部分数据将很快以gen2结尾,GC只能很少访问它。

此外,GC仅在收集期间遍历实时数据,死亡数据是“免费”收集的。所以当你的列表变得无法访问(或者如果大部分节点,但不是全部),那么GC将能够基本上免费地收集数百万个节点。