我有一个正在运行的进程的转储文件(试图找到内存泄漏)
我注意到的一件事是,当我通过大量物体转储时!windbg告诉我它们是GC第3代?
所有这些都是字节数组,所以当我查看转储中的所有字节数组时,我可以看到GC生成0,1,2和& 3.
有人可以解释这里发生了什么,因为我认为只有3代GC。
> 0:000> !do 0x0000000011b47450
Name: System.Byte[]
MethodTable: 000007fef7d2e798
EEClass: 000007fef7932670
Size: 131096(0x20018) bytes
GC Generation: 3
Array: Rank 1, Number of elements 131072, Type Byte
Element Type: System.Byte
Fields:
None
答案 0 :(得分:10)
.NET Framework有第四个堆(“generation”)专门用于大型对象,称为 - 大到足够 - 大对象堆。大于85,000字节的对象被分配到该堆上。
供参考:http://msdn.microsoft.com/en-us/magazine/cc163833.aspx
“!dh”命令的一个未记录的功能是您也可以轻松查看大对象堆。在查看大量输出时,我注意到列出的一些值来自第3代。因为.NET垃圾收集器,至少根据我读到的所有内容,只有三代(0,1和2),我是有点困惑。认为它可能是大对象堆,我手动转储大对象堆并比较值。果然,这就是我所看到的。要查看大对象堆中的对象,请使用3作为这样的生成:“!dh -stat -gen 3”。