我有一種服務會間歇性地開始吞噬服務器內存,並且需要重新啓動才能釋放它。我用gflags打開了+ ust,重新啓動了服務,並開始採用預定的UMDH快照。當問題重新出現時,資源管理器在「工作集」和「專用字節」下報告了多個GB,但UMDH快照僅在進程堆中佔用幾MB分配。資源監視器中報告的內存未在UMDH中顯示
在UMDH快照文件的頂部,它提到「只有堆管理器收集堆棧的分配被轉儲」。
指定+ ust標誌時,進程中的分配如何無蹤?
如何找出這些GB分配的位置/方式?
我有一種服務會間歇性地開始吞噬服務器內存,並且需要重新啓動才能釋放它。我用gflags打開了+ ust,重新啓動了服務,並開始採用預定的UMDH快照。當問題重新出現時,資源管理器在「工作集」和「專用字節」下報告了多個GB,但UMDH快照僅在進程堆中佔用幾MB分配。資源監視器中報告的內存未在UMDH中顯示
在UMDH快照文件的頂部,它提到「只有堆管理器收集堆棧的分配被轉儲」。
指定+ ust標誌時,進程中的分配如何無蹤?
如何找出這些GB分配的位置/方式?
UMDH是用戶模式轉儲堆的縮寫。術語堆是這裏的一個關鍵術語:它指的是C++堆管理器只有。這意味着所有通過除C++堆管理器以外的其他方式分配的內存都不會被UMDH跟蹤。
這可能是
VirtualAlloc()
但即使是C++,還有的情況是,大於512 kB的分配不能由C++堆管理器有效管理,因此它只是將其重定向到VirtualAlloc()
,並且不會創建這種大分配的堆段。
如何找出這些GB分配的位置/方式?
對於直接撥打VirtualAlloc()
,WinDbg命令!address -summary
可能會給出答案。對於.NET,SOS擴展和!dumpheap -stat
可以給出答案。