我正在尝试调试旧版网站中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);
}
}
}
在这里,如果您注意到该字符串数据。由于字符串是字符数组,因此也被视为LOH。Items2不是LOH,Items是LOH,但实际对象o不是LOH。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句