固定LOH中的对象会影响GC性能吗?

时间:2011-08-19 12:25:25

标签: .net garbage-collection

我已经读过托管堆中的固定对象会影响.NET中的GC性能,因为如果存在固定对象,GC就无法压缩内存。但是由于大对象堆无论如何都没有被压缩,所以这不应该适用于LOH中的对象。固定LOH中的物体还有其他隐藏成本吗?或者我可以安全地将对象固定在LOH中而不降低GC性能吗?

1 个答案:

答案 0 :(得分:5)

好吧,仅仅因为没有压缩大对象堆(LOH)并不意味着没有收集The LOH is collected并固定一个对象将会对未来的分配产生影响。

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

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

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

最后,由于LOH没有压缩,因此在GC期间此操作永远不会发生在此堆上,因此这不会受到影响。

总之,LOH上的分配肯定受到固定LOH上对象的引用的影响,而LOH上的集合很可能不会。

虽然我们不要忘记,分配和保存大块内存通常会对系统造成影响,但这些评论严格来说就是LOH