我的理解是,!dumpheap命令列出了.NET堆中存在的所有未被垃圾收集的对象。在那种情况下,如果我对对象地址(通过!dumpheap -mt XXX找到)运行!gcroot命令,它应该始终为我提供该对象引用位置的堆栈跟踪。但是,我正在寻找无法找到!dumpheap中列出的对象根目录的示例。我对!dumpheap和!gcroot的理解不正确吗?如果您想查看示例,请在here发布的其他问题中对其进行描述
最佳答案
!dumpheap
列出托管堆上的所有对象。其中一些可能有资格使用GC(即,它们没有根)。 SOS的最新版本具有-live
和-dead
标志,以专门列出此时可以或不能回收的对象。
同样,!dumpheap
还列出了“空闲”对象,这些对象是托管堆中尚未压缩的区域。样本输出:
73113f80 1 84 System.Exception
008c4cb8 8 96 Free <--- can be compacted at some point
731142a8 1 112 System.AppDomain
731169a4 1 132 System.Globalization.NumberFormatInfo
731162dc 2 144 System.Globalization.CultureInfo
731141a0 2 168 System.Threading.ThreadAbortException
73116d54 2 280 System.Byte[]
73117684 3 468 System.Collections.Generic.Dictionary`2+Entry[[System.Type, mscorlib], [System.Security.Policy.EvidenceTypeDescriptor, mscorlib]][]
731155f4 11 564 System.Int32[]
73116518 2 616 System.Globalization.CultureData
731147f8 4 718 System.Char[]
73115020 26 728 System.RuntimeType
73113e38 164 5502 System.String
730d0cdc 26 18152 System.Object[]