【问题标题】:C# Large objects and heapC# 大对象和堆
【发布时间】:2011-12-22 08:24:30
【问题描述】:

我对堆中大对象的存储有点困惑。比如对象被认为是大的大小是多少?哪些类型更有可能被视为大对象?是否有任何明确的分片方法适用于管理此类对象。

【问题讨论】:

    标签: c# object memory-management heap-memory


    【解决方案1】:

    This article 有很多细节,尽管你也应该注意changes coming in .NET 4.5

    可能最终出现在 LOH 上的唯一类型是字符串和数组 - 因为它们是唯一可以在执行时基本上可以指定大小的类型。我不确定是否有效 创建一个具有如此多字段的类型,以至于它最终会作为单个对象出现在 LOH 上 - 很可能是这样,但我无法想象它会发生在现实。

    根据链接文章,目前限制为 85,000 字节。不过,这确实是一个实现细节——您应该很少需要考虑它。

    【讨论】:

    • 感谢乔恩这将有助于直到 4.5 :)
    • 在收集第 2 代时,他们是否仍会保留只进行 LOH 收集的烦人行为?我问了一个关于微软这样做的原因的问题,但我仍然不明白从 L0/L1 GC 中免除 LOH 对象可以获得什么性能优势。据我所知,一个活动的 LOH 对象必须在实例化后标记其在其第一个 L0 或 L1 集合上保存引用的所有 L0/L1 对象;有什么技巧可以让微软跳过这一步吗?
    • @BarışAkkurt:已修复,谢谢 - 幸运的是作者将其移至博文 :)
    【解决方案2】:

    一般规则是:如果对象的大小为 85000 字节或更大,则认为它很大,并将放置在 LOH 上。

    由于某种原因,double[] 的处理方式有所不同,因此任何具有 1000 个或更多元素的双精度数组也会出现在 LOH 上。我还没有看到任何关于这个实现细节的官方文档,但它很容易验证。

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 2010-09-30
      • 1970-01-01
      • 2011-12-22
      • 2010-10-16
      • 2016-09-02
      • 2010-10-15
      • 1970-01-01
      • 2015-02-06
      相关资源
      最近更新 更多