我有一项服务,随着时间的推移间歇性地开始吞噬服务器内存,需要重新启动以释放它。我转向+ gstgs,重新启动服务,并开始采用预定的UMDH快照。当问题再次出现时,资源管理器在工作集和专用字节下报告了多个GB,但UMDH快照仅在进程'堆中占用几MB分配。
在UMDH快照文件的顶部,它提到“只有堆管理器收集堆栈的分配被转储”。
如果指定了+ ust标志,进程中的分配如何没有跟踪?
如何找出这些GB的分配位置/方式?
答案 0 :(得分:1)
UMDH是用户模式转储堆的缩写。术语堆是一个关键术语:它指的是C ++堆管理器仅。这意味着UMDH不会跟踪通过除C ++堆管理器之外的其他方式分配的所有内存。
这可以是
VirtualAlloc()
但即使对于C ++,也存在大于512 kB的分配无法由C ++堆管理器有效管理的情况,因此它只是将其重定向到VirtualAlloc()
并且不会创建如此大的分配的堆段
如何找出这些GB的分配位置/方式?
对于VirtualAlloc()
的直接调用,WinDbg命令!address -summary
可能会给出答案。对于.NET,SOS扩展和!dumpheap -stat
可以给出答案。