.net - 我对 dumpheap 和 gcroot 的理解不正确吗

标签 .net garbage-collection windbg sos

我的理解是!dumpheap 命令列出了 .NET 堆中存在的所有未被垃圾收集的对象。在这种情况下,如果我针对对象地址运行 !gcroot 命令(通过 !dumpheap -mt XXX 找到),它应该始终为我提供引用该对象的堆栈跟踪。但是,我发现无法找到 !dumpheap 中列出的对象根的示例。我对 !dumpheap 和 !gcroot 的理解不正确吗?如果您想查看示例,请在我发布的其他问题 here 中进行描述。

最佳答案

!dumpheap 列出托管堆上的所有对象。其中一些可能符合 GC 条件(即它们未获得 root 权限)。最新版本的 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[]

关于.net - 我对 dumpheap 和 gcroot 的理解不正确吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25290449/

相关文章:

c# - 在 WinDbg 中显示 C# 堆栈跟踪时出现问题

.net - Windows 服务部署

c# - 如何在 C# 中对自定义 HTTP header 进行编码

c# - 在 C# 中直接从文件加载字体

ruby - 如何解决由于 Ruby 中的垃圾回收引起的偶发性崩溃

c# - clr abi文档中的"this"指针

c# - 在 C# 中将 Guid 转换为 2 个 longs 并将 2 个 longs 转换为 Guid

.net - 事件处理程序的垃圾收集

java - 为什么我的变量没有超出范围?

arrays - WINDBG,如何查看数组的内容?