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

Nik*_*iki 9 .net garbage-collection

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

cas*_*One 5

好吧,仅仅因为大对象堆(LOH)没有被压缩并不意味着它没有被收集. 收集LOH并固定一个物体,这将对未来的分配产生影响.

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

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

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

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

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

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