仅使用第2代收集大型对象堆对象有什么优势?

时间:2011-06-24 17:07:27

标签: .net garbage-collection large-object-heap

我知道分代垃圾收集可以提高性能,因为

  1. 在非Gen2集合中,任何对象都必须最多移动两次,而Gen2集合很少见。
  2. 如果系统正在执行Gen0集合并且自上一代Gen0集合以来尚未写入对象(Gen1或Gen2),则系统将不必扫描该对象以标记其中的任何引用(因为它们都是Gen1或Gen2)。同样,如果系统正在执行Gen1集合,它可以忽略自上一代Gen1集合以来未写入的任何对象。由于垃圾收集的大部分工作都是扫描对象,因此缩短扫描时间是一大胜利。
但是,我很好奇,从Gen1垃圾收集中省略大对象会有什么性能优势?大型对象即使被垃圾收集器扫描也不会重新定位,我希望Gen1集合仍然必须扫描其内容,除非或直到两个连续的Gen1集合发生而没有插入对象写入。

我有没有看到一些性能优势?

1 个答案:

答案 0 :(得分:0)

  但是,我很好奇,从Gen1垃圾收集中省略大对象会有什么性能优势?

有两件事 -

首先,大型物体(大到足以放在LOH上)往往具有更长的寿命。短暂的大型物体很少见,在需要的情况下,您通常可以重复使用它们。通过不进行扫描,您可以有效地避免扫描,这种扫描几乎总是会导致无论如何都要保留物体。这往往会给你一个胜利。

此外,为了有效地处理Gen1中的对象,并获得Gen1提供的许多优点,他们需要能够压缩。分代收集器的一大优势是,您可以压缩最新的分配,这有助于保持内存压力更低,因为碎片往往表现更好。 Gen1中的大型对象会导致性能或内存问题,因为它们要么需要压缩(现在,大型对象不会被压缩,因为“移动”它们很昂贵)或者它们会导致额外的碎片蠕动。