添加到大对象堆的对象

Dar*_*ung 0 c# large-object-heap

我试图在我们的旧网站中调试 CPU 使用率高的原因,并且通过查看 DebugDiag 中的一些分析,我怀疑 LOH 上的对象数量以及随后的 GC 收集可能是一个原因。在一个 .dbg 文件中,我们在 LOH 上有大约 3.5gb,其中大部分对象是字符串。

我知道要在 LOH 上运行的对象,它们必须超过 85000 字节。

例如,我不确定这是否指的是单个数组。或者它可以引用一个大对象图?

我的意思是,如果我有对象 Foo,它包含 n 个其他对象,每个对象本身包含 n 个对象。如果这些对象中的每一个都包含字符串,并且 Foo(和所有子对象)的总大小大于 85000 字节,那么 Foo 会放在 LOH 上吗?或者,如果在 Foo 对象图中的某个地方有一个大于 85000 字节的数组,它是否只是放在 LOH 上的那个数组?

谢谢。

dot*_*tep 5

您是对的,如果数组大于 85000,那么它将被视为 LOH 而不是整个对象。为了在这里解释这一点,我创建了示例。

   class Program
    {
        static void Main(string[] args)
        {
            Obj o = new Obj();
            o.Allocate(85000);
            Console.WriteLine(System.GC.GetGeneration(o));
            Console.WriteLine(System.GC.GetGeneration(o.items));
            Console.WriteLine(System.GC.GetGeneration(o.items2));
            Console.WriteLine(System.GC.GetGeneration(o.Data));
            Console.ReadLine();           
        }

        class Obj
        {
            public byte[] items = null;

            public byte[] items2 = null;

            public string Data = string.Empty;

            public void Allocate(int i)
            {
                items = new byte[i];
                items2 = new byte[10];
                Data = System.Text.Encoding.UTF8.GetString(items);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

在这里,如果您注意到字符串数据。它也被视为 LOH,因为字符串是字符数组。Items2 不是 LOH,Items 是 LOH,但实际对象 o 不是 LOH。