我读到,在托管堆中固定对象会影响 .NET 中的 GC 性能,因为如果“妨碍”固定对象,GC 就无法压缩内存。但由于大型对象堆无论如何都不会被压缩,因此这不适用于 LOH 中的对象。固定 LOH 中的对象是否还有其他隐藏成本?或者我可以安全地将对象固定在 LOH 中而不降低 GC 性能吗?
最佳答案
好吧,仅仅因为大对象堆 (LOH) 未压缩并不意味着它未被收集。 The LOH is collected并将对象固定在那里将对 future 的分配产生影响。
由于对象被固定,它会有效地缩小 LOH 中的可用内存量(与持有引用时的情况相同)。当发出另一个分配大对象的请求时,如果 LOH 中有太多固定/保留的引用,则在分配更多大对象时可能会遇到问题。
当在垃圾收集的标记和清除部分完成标记时,CLR 可能会标记所有固定为根的引用,因此在这部分收集期间可能不会产生任何影响;如果有人保留对大对象的引用,它的行为也会相同。
由于释放在 LOH 上以相同的方式发生(该 block 被简单地标记为可用),因此此操作也不会受到影响。
最后,由于 LOH 未压缩,因此在 GC 期间此操作永远不会在此堆上发生,因此此处不会受到影响。
总之,LOH 上的分配肯定会受到对 LOH 上对象的固定引用的影响,而 LOH 上的集合很可能不会。
虽然我们不要忘记分配和持有大内存块通常会对系统产生影响,但这些评论严格来说是关于 LOH。
关于.net - 将对象固定在 LOH 中是否会影响 GC 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7121518/