监视桌面堆内存

时间:2011-04-27 20:19:55

标签: windows

有没有办法弄清楚哪个应用程序正在耗尽所有桌面堆内存?

有关“桌面堆”的说明,请参阅this MSDN blog

编辑:如果您不知道“桌面堆内存”是什么,请不要回答。

EDIT2:如果您不知道“桌面堆内存”是什么,请不要投票来关闭问题。

3 个答案:

答案 0 :(得分:4)

根据此blog帖子,您应该查找用户对象。 要查找错误的应用程序,可以在Process Explorer中配置USER Objects列。然后按用户对象降序排序。用户对象是所有GUI对象,如Windows,工具栏,图标,光标......具有最高值的过程很可能是坏的。

从微软下载直接链接:DHeapMon

答案 1 :(得分:0)

如果你想在你的程序中做到这一点,C ++可以使用WMI找到罪魁祸首。

答案 2 :(得分:0)

免责声明:我为Microsoft工作,这些是我个人的想法和经验,可能会或可能不会反映当前或将来的Microsoft政策/程序/等。

我知道这很旧,但是由于偶然发现了它,所以我想提供一些反馈/答案。

桌面堆监视器在Vista +上不起作用。 DHeapMon依赖修补内核二进制文件以跟踪桌面堆的功能-此行为被阻止,这就是为什么它不起作用的原因。

要监视自己的桌面堆,您所要做的就是查看用户对象(不幸的是)。

要获得完整的答案,您可以与Microsoft并使用内核或完整转储(不是进程转储!)一起打开支持通知单,他们可以检查堆并为您提供一些信息。它是通过我编写的调试器扩展程序从转储文件中提取的。

限制:

  1. 仅在内核模式下工作。即使用户模式下存在桌面堆映射,该扩展也不支持它。即使我添加了对桌面堆的用户模式调试的支持,它也会受到限制,因为某些相关数据仅处于内核模式。 Windows 10的最新版本的更改可能会进一步限制它,因此我没有花时间添加用户模式支持。

  2. 它无法测量转储中没有的内容。换句话说,如果桌面堆缺少页面,它将尽力而为,但显然会失去准确性。

  3. 由于堆管理器的更改,因此不支持Windows 10 build 1809或Server 2019。

编码愉快!