2011-04-27 114 views
8

有什麼方法可以找出哪個應用程序正在使用所有桌面堆內存?監控桌面堆內存

有關「桌面堆」的說明,請參閱this MSDN blog

編輯:如果你不知道什麼「桌面堆內存」是請不要回答。

編輯2:如果你不知道什麼「桌面堆內存」是不投票關閉的問題。

回答

0

如果您想在您的程序中執行此操作,C++可以使用WMI來查找罪魁禍首。

+0

不是我的程序。服務器上有東西泄漏桌面堆內存,我需要弄清楚它是什麼。 WMI是否專門爲桌面堆設置了鉤子?請鏈接? – 2011-04-27 20:26:13

+0

http://msdn.microsoft.com/en-us/library/aa390423(v=vs.85).aspx – Jess 2011-04-27 20:30:10

+0

...但不能只使用建議的SLaks TaskManager?選擇查看/選擇列 – Jess 2011-04-27 20:30:26

3

根據這blog後,你應該尋找用戶對象。 要查找錯誤的應用程序,您可以在Process Explorer中配置USER對象列。然後按用戶對象降序排序。用戶對象都是GUI對象,如Windows,工具欄,圖標,光標......具有最高值的過程很可能是壞的過程。

可直接下載鏈接:DHeapMon from microsoft。

+0

我認爲用戶對象只是泄漏桌面堆的方法之一。沒有GUI應用程序在這裏運行,只有服務器應用程序,所以它不太可能幫助;我希望能夠清楚地瞭解這種類型:應用程序a使用10Kb的桌面堆內存,應用程序b ... – 2011-04-27 20:50:20

+0

即使對於服務器進程也是Windows創建的。考慮隱藏的Window COM用於其STA消息泵。由於Windows是關於COM的,所以即使在服務器應用程序中也有相當多的窗口。據我所知,無法列出每個進程的桌面堆使用情況。由於對象是句柄,因此無法告訴該圖標正在使用的是多少桌面堆內存。 – 2011-04-27 21:30:52

+0

我確信有一種方法,但它需要有一個內核驅動程序。 MS中的debugheap diag工具是內核驅動程序。不幸的是,它只顯示總使用量,而不顯示誰在使用它。你說得對,服務器進程有GUI對象,但我認爲他們不會泄漏......並且肯定有與non-gui相關的使用dh的對象。當然值得一試。 – 2011-04-27 22:22:05