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 上的那个数组?
谢谢。
您是对的,如果数组大于 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。
| 归档时间: |
|
| 查看次数: |
698 次 |
| 最近记录: |