![](/img/trans.png)
[英]What accounts for the difference between the size of the heap (as reported by umdh) and the (private) working set (as reported by task manager)?
[英]Memory reported in Resource Monitor not showing in UMDH
我有一個服務隨着時間的推移間歇性地開始吞噬服務器內存,需要重新啟動才能釋放它。 我用 gflags 關閉 +ust,重新啟動服務,並開始拍攝預定的 UMDH 快照。 當問題再次發生時,資源管理器在工作集和專用字節下報告了多個 GB,但 UMDH 快照僅占進程堆中的幾個 MB 分配。
在 UMDH 快照文件的頂部,它提到“僅轉儲堆管理器收集堆棧的分配”。
當指定了 +ust 標志時,進程中的分配怎么可能沒有蹤跡?
如何找出這些 GB 的分配位置/方式?
UMDH 是用戶模式轉儲堆的縮寫。 術語堆是一個關鍵項的位置:它是指只有C ++堆管理器。 這意味着 UMDH 不會跟蹤通過 C++ 堆管理器以外的其他方式分配的所有內存。
這可以是
VirtualAlloc()
但即使對於 C++,也存在大於 512 kB 的分配無法由 C++ 堆管理器有效管理的情況,因此它只是將其重定向到VirtualAlloc()
而不會創建如此大分配的堆段。
如何找出這些 GB 的分配位置/方式?
對於直接調用VirtualAlloc()
,WinDbg 命令!address -summary
可能會給出答案。 對於 .NET,SOS 擴展和!dumpheap -stat
可以給出答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.