第3代对象与大对象堆之间的区别

大对象堆和GC第3代对象有什么区别?

LOH(大对象堆)是一个单独的堆,其中大对象直接分配并保持在那里直到它们被收集。 对象基于它们的大小直接分配到LOH中,例如等于或大于85000字节。

分代对象是分配到SOH(小对象堆)中的“小”对象,SOH是单个堆。 SOH中的对象具有相关联的生成,其表示它们在最大生成期间存活了多少集合,例如2.当生成数从0开始时,第2代中的对象可以被描述为第3代,因为它已经存在于最小值3个集合,即代0,1,2。

Generations有助于优化垃圾扫描。 长寿命对象的生成数量随着它们在收集中存活而增加,并且具有较高数量的世代被较少地扫描。 这种机制导致不太短暂的对象被不那么频繁地扫描,因此不必要地扫描。 生成方案应用于SOH,因为它被视为对存在大量对象的堆的良好优化。

更新

据我所知,LOH对象被报告为最大代,但我相信这只是一个默认值。 它们实际上并不属于任何一代,即第2代SOH对象和LOH对象不在同一“列表”中。 然而,正如@Henk所指出的,当执行第2代集合时,此时也会收集LOH对象。 因此,概念上,第2代和LOH之间存在关系。 从.Net 2.0开始这是正确的:

请参阅: 未覆盖的大对象堆

从世代的角度来看,大型对象属于第2代,因为只有在第2代集合时才会收集它们。

然而,尽管收集关系是显而易见的,但它不能保持的一个例子是生成压缩。 当收集一代时,它也可以被压缩。 然而,LOH并没有被压缩,因此不能说第2代对象发生的一切都发生在LOH中的对象上。

[Test] public void large_object_heap_objects_are_reported_as_max_generation() { int[] bling = new int[85000 / 4]; int maxGen = GC.MaxGeneration; int objectGen = GC.GetGeneration(bling); Assert.AreEqual(maxGen, objectGen, "Large object is at max generation."); }