c# - 第三代对象和大对象堆之间的区别

标签 c# memory-management garbage-collection large-object-heap

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

最佳答案

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

From a generation point of view, large objects belong to generation 2 because they are collected only when there is a generation 2 collection.

然而,尽管集合关系很明显,但它不成立的一个例子是生成压缩。当一代被收集时,它也可能被压缩。然而,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.");
}

关于c# - 第三代对象和大对象堆之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4875364/

相关文章:

c++ - 愚蠢的STL问题

Linux free 显示高内存使用率,但 top 没有

ruby - Ruby 2.2 中的垃圾收集器引发意想不到的 CoW

python - 为什么 Django 的信号处理默认使用弱引用进行回调?

java - 避免多次垃圾收集执行

c# - 在标签中显示 ListView 行

c# - 如何获取 expando 对象的值(value) #

c# - 如何从 WebBrowser 组件获取 HTMLElement 的所有属性

c# - 我如何正确使用依赖注入(inject)?

c - 进程资源不受 setrlimit 限制