大对象堆和GC第3代对象有什么区别?
答案 0 :(得分:18)
LOH(大对象堆)是一个单独的堆,其中大对象直接分配并保持在那里直到它们被收集。根据对象的大小将对象直接分配到LOH中。等于或大于85000字节。
分代对象是分配到SOH(小对象堆)中的“小”对象,它是单个堆。 SOH中的对象具有相关联的生成,其表示它们在最大生成之前存活了多少个集合,例如2.当世代号从0开始时,第2代中的一个对象可以被描述为第3代,因为它至少存在3个集合,即第0,1,2代。
Generations有助于优化垃圾扫描。长寿命对象的生成数量随着它们在收集中存活而增加,并且具有较高数量的世代被较少地扫描。这种机制导致不太短暂的对象被不那么频繁地扫描,因此不必要地扫描。生成方案应用于SOH,因为它被视为对存在大量对象的堆的良好优化。
<强>更新强>
据我所知,LOH对象被报告为最大代,但我相信这只是一个默认值。它们实际上不在任何一代中,即第2代SOH对象和LOH对象不在同一“列表”中。但是,正如@Henk所指出的那样,在执行第2代集合时,此时也会收集LOH对象。因此,概念上,第2代和LOH之间存在关系。从.Net 2.0开始这是正确的:
请参阅:Large Object Heap Uncovered
从世代的角度来看,大型对象属于第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.");
}