GC生成3出现在windbg中

Joh*_*020 10 .net c# clr

我有一个正在运行的进程的转储文件(试图找到内存泄漏)

我注意到的一件事是,当我通过大量物体转储时!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
Run Code Online (Sandbox Code Playgroud)

Col*_*ell 11

.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".

  • 鉴于OP在倾销"更大的物体"时注意到它,这似乎是一个合理的假设.但是,我确实在这里找到了一个具体的参考:http://msdn.microsoft.com/en-us/magazine/cc163833.aspx (2认同)