我对dumpheap和gcroot的理解不正确

cra*_*ice 3 .net garbage-collection windbg sos

我的理解是!dumpheap命令列出了.NET堆中存在的所有非垃圾回收对象.在这种情况下,如果我对一个对象地址运行!gcroot命令(通过!dumpheap -mt XXX找到),它应该总是给我一个引用该对象的堆栈跟踪.但是我找到了一些例子,我可以找到!dumpheap中列出的对象的根.是我的理解!dumpheap和!gcroot不正确?如果您想查看示例,请在此处发布我在其他问题中描述的示例

Bri*_*sen 6

!dumpheap列出托管堆上的所有对象.其中一些可能符合GC的条件(即它们没有根).SOS的最新版本具有-live-dead标志,专门列出了可能或不能在这一点上回收的对象.

同样,!dumpheap还列出了"Free"对象,这些对象是托管堆中尚未压缩的区域.样本输出:

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[]
Run Code Online (Sandbox Code Playgroud)

  • 这些只是名为"免费".它们不是托管对象,而只是托管堆中可用于分配的区域. (2认同)