什么是 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 报告为<unknown>
的内存是通过VirtualAlloc()
分配的内存。一些常见的来源是:
VirtualAlloc()
C++ HeapAlloc()
调用大于某个限制(如果我没记错的话是 512k)
MSXML
位图(根据@Hans Passant的评论)
【讨论】:
关于 HeapAlloc 行为的有趣事实。还要感谢 Hans 提到位图。这很可能是罪魁祸首。以上是关于什么是 WinDbg <unknown> 内存?的主要内容,如果未能解决你的问题,请参考以下文章
为啥类型 `Record<string,unknown>` 不接受具有已定义键的对象作为值
android.view.InflateException: Binary XML file line #12: Error inflating class <unknown>