什么是 WinDbg <unknown> 内存?

Posted

技术标签:

【中文标题】什么是 WinDbg <unknown> 内存?【英文标题】:What is WinDbg <unknown> Memory? 【发布时间】:2017-01-18 10:56:38 【问题描述】:

我正在调试一个 Winforms 应用程序的内存泄漏。在客户提供的转储文件中,未知内存使用量与 .NET Heap 大小存在较大差异。 (大约 1000mb 与 200mb)。那么除了 CLR 完成的 VirtualAllocs 之外,未知段中还有什么?

!eeheap -gc 输出

!address -摘要输出

【问题讨论】:

在winforms应用中通常是Bitmap对象需要的像素数据。忘记调用他们的 Dispose() 方法是一个非常常见的错误。 Windbg 并没有对这种疏忽提供太多见解。运行任务管理器并添加 GDI 对象和 USER 对象列,确保您的程序的值不会不断攀升并且不会过高。并支持托管内存分析器。不要等太久才开始寻找漏洞,以免淹没在数据中。 只是补充一点:位图是一个合法的可终结对象。如果您忘记强制处置对象,GC 所做的就是将它排队到终结器线程,在那里它确实在某个不确定的未来时间被处置。根据 MS 的说法,可终结对象“实际上死了第二次”,并且只会在 1) 运行 GC 并将其放置在终结器队列中之后才真正释放所有引用消失。 2) 终结器在对象上运行并释放非托管位,然后 3) GC 再次运行并释放托管部分。 【参考方案1】:

WinDbg 报告为&lt;unknown&gt; 的内存是通过VirtualAlloc() 分配的内存。一些常见的来源是:

.NET(因为它有自己的堆管理器) 在您的代码中直接调用VirtualAlloc() C++ HeapAlloc() 调用大于某个限制(如果我没记错的话是 512k) MSXML 位图(根据@Hans Passant的评论)

【讨论】:

关于 HeapAlloc 行为的有趣事实。还要感谢 Hans 提到位图。这很可能是罪魁祸首。

以上是关于什么是 WinDbg <unknown> 内存?的主要内容,如果未能解决你的问题,请参考以下文章

在退出 WinDbg 之前执行命令

为啥类型 `Record<string,unknown>` 不接受具有已定义键的对象作为值

android.view.InflateException: Binary XML file line #12: Error inflating class <unknown>

maven下载出现unknown文件夹

如何分析windbg中的<unclassified>内存使用情况

再谈Windbg脚本装载指令