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

Working set 资源监视器中报告的内存未在UMDH中显示,working-set,resource-monitor,umdh,Working Set,Resource Monitor,Umdh,我有一个服务,它会随着时间的推移间歇性地开始占用服务器内存,需要重新启动以释放内存。我使用gflags打开+ust,重新启动服务,并开始拍摄预定的UMDH快照。当问题再次出现时,资源管理器报告工作集和专用字节下有多个GB,但UMDH快照只占进程堆中的少数MB分配 在UMDH快照文件的顶部,它提到“仅转储堆管理器为其收集堆栈的分配”。 当指定了+ust标志时,进程中的分配怎么可能没有跟踪 如何找出这些GBs的分配位置和方式?UMDH是用户模式转储堆的缩写。堆这个词是这里的一个关键术语:它只引用C+

我有一个服务,它会随着时间的推移间歇性地开始占用服务器内存,需要重新启动以释放内存。我使用gflags打开+ust,重新启动服务,并开始拍摄预定的UMDH快照。当问题再次出现时,资源管理器报告工作集和专用字节下有多个GB,但UMDH快照只占进程堆中的少数MB分配

在UMDH快照文件的顶部,它提到“仅转储堆管理器为其收集堆栈的分配”。
当指定了+ust标志时,进程中的分配怎么可能没有跟踪


如何找出这些GBs的分配位置和方式?

UMDH是用户模式转储堆的缩写。堆这个词是这里的一个关键术语:它只引用C++堆管理器。这意味着,所有的内存分配的其他方法比C++堆管理器没有被UMDH .< /P>跟踪。 这可能是

  • 直接调用
    VirtualAlloc()
  • .NET使用的内存,因为.NET有自己的堆管理器
<> P>但是,对于C++,存在的情况是,大于512 kb的分配不能被C++堆管理器有效地管理,因此它只是将它重定向到ValualLoCube()/Cyto>并不创建这样大的分配的堆段。 我如何知道这些GBs是在哪里/如何分配的

要直接调用
VirtualAlloc()
,请使用WinDbg命令
!地址-摘要
可能会给出答案。对于.NET,SOS扩展和
!dumpheap-stat
可以给出答案