【问题标题】:How do I know an array of structures was allocated in the Large Object Heap (LOH) in .NET?我如何知道在 .NET 的大对象堆 (LOH) 中分配了结构数组?
【发布时间】:2010-05-06 00:26:31
【问题描述】:

在使用 CLR Profiler 进行一些实验后,我发现:

Node[,] n = new Node[100,23]; //'84,028 bytes, is not placed in LOH
Node[,] n = new Node[100,24]; //'86,428 bytes, is 

    public struct Node {
        public int Value;
        public Point Point;
        public Color Color;
        public bool Handled;
        public Object Tag;
    }

在运行时,我如何知道在大对象堆 (LOH) 中分配了结构数组(或任何数组)?

【问题讨论】:

  • 我不相信这是可能的(不自己使用分析 API)。你为什么想知道?
  • 我遇到了应用程序使用的一种结构的性能问题。我已经成功优化了其他数组(stackoverflow.com/questions/2762424/…)。然而,这种结构才是真正的性能杀手。
  • 如果只是为了性能调优,那为什么不像以前一样使用分析器呢?

标签: .net arrays large-object-heap


【解决方案1】:

任何大于 85,000 字节的对象都将存储在 LOH 中。这是一篇关于 .Net Memory Management 的精彩博文。

【讨论】:

  • 对于 double[],当前 (.NET RT 4.0) 的限制为 8k
【解决方案2】:

您可以在分配后立即找到。使用 GC.GetGeneration(object) 重载获取生成号,对象位于。对于 LOH,这将是 2。

Node[,] n = new Node[100,23]; 
// GC.GetGeneration(n) should give 0
Node[,] n = new Node[100,24]; 
// GC.GetGeneration(n) should give 2

注意,这有一些限制,绝不是生产代码的正确方法,我假设:如果您稍后查询该数字,则该对象可能已经从 Gen 0 移动到 Gen 2。我无法区分 Gen2(小对象)堆和 LOH。此外,对于我测试过的所有 .NET 版本,LOH 上的对象返回的数量是 2。但是我在真正的规范中找不到这个,所以它也可能是一个改变的问题。

【讨论】:

  • +1 创新思维。好的。聪明的。我应该想到的东西。我稍后会试一试。
  • @AMissico:谢谢!很高兴知道,你喜欢它(即使 +1 没有到达;))
  • @user492238:当我验证您的答案时,您将获得实际投票。 :O)
  • @AMissico:好吧,我不会乞求它;)但通常“+1”意味着投票。当可以验证答案时,这宁愿将其限定为“正确的解决方案”:)
【解决方案3】:

根据您的 cmets,我认为您实际上不需要知道对象是否会继续 LOH。当您真正想做的只是在用户输入“太大”的值时向用户显示警告时,这是否是您的应用程序变慢的实际原因是无关紧要的。

所以我建议一些更简单的方法:只需使用一些试错法来确定截止值。如果他们输入的大小超过了您的试错值,则显示警告。

至于您的实际性能问题,您可以简单地分配一堆“较小”的一维数组,而不是分配一个大的二维数组。而不是:

Node[,] n = new Node[100,100]; // this will go the LOH

你会这样做:

Node[][] n = new Node[100][];
for(int i = 0; i < n.Length; i++) {
    n[i] = new Node[100];  // none of these will be on the LOH
}

您仍然拥有相同数量的节点,但 LOH 上不会发生任何事情。就个人而言,我认为您可能会发现性能实际上并没有太大的不同,但尝试一下可能是值得的。

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 2021-03-17
    • 2016-02-29
    • 2019-12-02
    • 2021-12-09
    • 2010-12-14
    • 2015-08-21
    • 2023-01-12
    • 2023-03-06
    相关资源
    最近更新 更多