资源监视器中报告的内存未在UMDH中显示

时间:2016-04-21 15:20:47

标签: working-set resource-monitor umdh

我有一项服务,随着时间的推移间歇性地开始吞噬服务器内存,需要重新启动以释放它。我转向+ gstgs,重新启动服务,并开始采用预定的UMDH快照。当问题再次出现时,资源管理器在工作集和专用字节下报告了多个GB,但UMDH快照仅在进程'堆中占用几MB分配。

在UMDH快照文件的顶部,它提到“只有堆管理器收集堆栈的分配被转储”。
如果指定了+ ust标志,进程中的分配如何没有跟踪?

如何找出这些GB的分配位置/方式?

1 个答案:

答案 0 :(得分:1)

UMDH是用户模式转储堆的缩写。术语堆是一个关键术语:它指的是C ++堆管理器。这意味着UMDH不会跟踪通过除C ++堆管理器之外的其他方式分配的所有内存。

这可以是

  • 直接拨打VirtualAlloc()
  • .NET使用的内存,因为.NET有自己的堆管理器

但即使对于C ++,也存在大于512 kB的分配无法由C ++堆管理器有效管理的情况,因此它只是将其重定向到VirtualAlloc()并且不会创建如此大的分配的堆段

  

如何找出这些GB的分配位置/方式?

对于VirtualAlloc()的直接调用,WinDbg命令!address -summary可能会给出答案。对于.NET,SOS扩展和!dumpheap -stat可以给出答案。