2011-08-19 45 views
9

我读过托管堆中的固定对象影响了.NET中的GC性能,因为如果固定对象“在途中”,GC无法压缩内存。但是由于大型对象堆无论如何都不被压缩,所以这不适用于LOH中的对象。钉住LOH中的物体还有其他隐藏成本吗?或者我可以在不降低GC性能的情况下安全地将物体固定在LOH中?锁定LOH中的对象是否影响GC性能?

回答

5

那么,只是因为大对象堆(LOH)没有压缩并不意味着它不是而是收集了The LOH is collected并且锁定对象将会对未来的分配产生影响。

因为一个对象被固定,它会有效地缩小LOH中可用的内存量(就像持有引用一样)。当另一个分配大对象的请求发生时,如果在LOH中有太多固定/保持的引用,则可能会遇到分配更多大对象的问题。

当标记在垃圾回收的标记和扫描部分完成时,CLR可能会标记所有引用被固定为根,因此在此部分集合期间可能没有影响;如果有人保留对大对象的引用,它的行为方式也是相同的。

由于释放在LOH上发生的方式相同(块简单地标记为可用),因此该操作也不受影响。

最后,由于LOH没有压缩,所以在GC中这个操作不会发生在堆上,所以这里不会影响到这个操作。

总之,对LOH的分配可以通过锁定对LOH上对象的引用而受到影响,而LOH上的分配很可能不会受到影响。

尽管我们不要忘记,分配和保存大块内存通常会对系统产生影响,但这些注释严格遵守LOH的

+0

感谢您的回答。我不确定我会得到第二段:为什么固定收缩可用内存比保留参考更多?我总是尽管分配上蕙基本上意味着寻找一个空闲内存块足够大或分配一个新段的东西 - 如果是这样,任何活块应该被同等对待,固定与否。 – Niki

+0

@nikie:它没有做任何更多的,它只是具有相同的效果(如你所述)。我相应地更新了我的答案。这是一个小而重大的变化。 – casperOne