2011-04-27 112 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