首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >第三代对象与大对象堆的区别

第三代对象与大对象堆的区别
EN

Stack Overflow用户
提问于 2011-02-02 22:07:36
回答 1查看 3.2K关注 0票数 4

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-02 22:10:20

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

分代对象是被分配到SOH (小对象堆)中的“小”对象,SOH是一个单独的堆。SOH中的对象具有相关联的世代,该世代表示它们存活了多少集合直到最大世代,例如2。由于世代编号从0开始,因此世代2中的对象可以被描述为第三代,因为它经历了最少3个集合,即世代0、1、2。

生成有助于优化垃圾扫描。长寿对象的世代数量随着它们在收集中幸存下来而增加,并且具有较高数量的世代被扫描的频率较低。这种机制导致不是短寿命的对象被较少地频繁地扫描,因此不必要。世代方案被应用于SOH,因为它被视为堆的一个很好的优化,其中将有许多对象。

更新

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

请参阅:Large Object Heap Uncovered

从代的角度来看,大对象属于第2代,因为它们仅在存在第2代集合时才被收集。

然而,尽管集合关系很明显,但它不存在的一个示例是生成压缩。当收集一个层代时,它也可以被压缩。然而,LOH并不是紧凑的,所以不能说发生在第二代对象上的所有事情都发生在LOH中的对象上。

代码语言:javascript
运行
复制
[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.");
}
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4875364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档