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