1

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

  1. 在非 Gen2 集合中,任何对象最多必须移动两次,Gen2 集合很少见。
  2. 如果系统正在执行 Gen0 收集,并且自上次 Gen0 收集以来尚未写入对象(Gen1 或 Gen2),则系统不必扫描该对象以标记其中的任何引用(因为它们都将是 Gen1或 Gen2)。同样,如果系统正在执行 Gen1 收集,它可以忽略自上次 Gen1 收集以来未写入的任何对象。由于垃圾收集的大部分工作是扫描对象,因此减少扫描时间是一个很大的胜利。

不过,我很好奇,从 Gen1 垃圾收集中省略大对象会有什么性能优势?大对象即使被垃圾收集器扫描也不会重新定位,我希望 Gen1 集合仍然必须扫描它们的内容,除非或直到两个连续的 Gen1 集合发生而没有干预对象写入。

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

4

1 回答 1

0

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

有两件事——

首先,大对象(大到足以在 LOH 上)往往具有更长的生命周期。短期大对象很少见,在需要的情况下,您通常可以重用它们。通过不扫描,您可以有效地避免几乎总是会导致保留对象的扫描。这往往会给你带来性能上的胜利。

此外,为了有效地处理 Gen1 中的对象,并获得 Gen1 提供的许多优势,它们需要能够压缩。分代收集器的一大优势是您正在压缩最新的分配,这有助于降低内存压力,因为碎片往往表现得更好。Gen1 中的大对象会导致性能或内存问题,因为它们要么需要压缩(现在,大对象没有被压缩,因为“移动”它们的成本很高),要么它们会导致额外的碎片蔓延。

于 2011-06-24T17:17:55.787 回答