windows - 如何在 win32 进程中显示 'memory used' 的百分比?

标签 windows memory winapi memory-management

我知道内存使用在 Windows 上是一个非常复杂的问题。

我正在尝试为一个大型应用程序编写一个 UI 控件,该控件显示“已用内存百分比”数字,以便向用户表明可能是时候清理一些内存了,或者更有可能重新启动应用。

一个实现使用 MEMORYSTATUSEX 的 ullAvailVirtual 作为基础,然后使用 HeapWalk() 遍历进程堆以寻找额外的空闲内存。 HeapWalk() 步骤是必需的,因为我们注意到在运行一段时间后,由堆分配和释放的内存从未返回并由 ullAvailVirtual 数字报告。经过数小时的密集工作,ullAvailVirtual 数字不再准确报告可用内存量。

然而,这种方法被证明并不理想,因为即使进程堆未损坏,HeapWalk() 也会偶尔返回奇怪的错误。此外,由于这是一个 UI 控件,堆遍历代码每 5-10 秒执行一次。我尝试联系 Microsoft 了解 HeapWalk() 失败的原因,通过 MSDN 升级了一个案例,但除了“你可能不应该那样做”之外没有得到任何答案。

因此,作为第二个实现,我使用来自 PROCESS_MEMORY_COUNTERS 的 PagefileUsage 作为基础。然后,我使用 VirtualQueryEx 遍历虚拟地址空间,将所有非 MEM_FREE 的区域加起来,并为 GetMappedFileNameA() 返回一个值。我的想法是,PageFileUsage 本质上是“私有(private)字节”,因此如果我将该值加上我的进程使用的 DLL 的总大小,这将是我的进程使用的内存量的一个很好的近似值。

第二种方法似乎(有点)有效,至少它不会像堆遍历器方法那样导致崩溃。但是,当启用这两种方法时,值并不相同。所以其中一种方法是错误的。

那么,StackOverflow 世界...您将如何实现它?

  • 哪种方法更有前途,或者您有第三种更好的方法?
  • 我是否应该回到原来的方法,进一步调试奇怪的错误?
  • 我应该避免每 5-10 秒遍历一次堆吗?

请记住,重点是向用户表明它正在变得“危险”,他们应该释放内存或重新启动应用程序。也许“使用百分比”不是解决此问题的最佳方法?什么是?我的另一个想法是基于颜色的系统(红色、黄色、绿色,我可以基于更多因素而不仅仅是一个数字)

最佳答案

是的,Windows 内存管理器经过优化以尽可能快速高效地满足内存请求,但优化以轻松测量已使用的空间量。第一个缺点是释放的堆 block 很少被取消映射。它们被简单地标记为“空闲”,以供下一次分配使用。这就是 VirtualQueryEx() 无法工作的原因。

HeapWalk 的问题在于您必须锁定堆 (HeapLock),以便它可以在不更改堆分配的情况下遍历它。该锁可能会产生非常有害的副作用。引用:

Walking a heap may degrade performance, especially on symmetric multiprocessing (SMP) computers. The side effects may last until the process ends.

即便如此,您返回的数字也毫无意义。程序永远不会用完可用空间,它会用完足够大的连续内存块来满足请求。恐怕没有满意的答案。除了一个:64 位操作系统的成本不到 200 美元。

关于windows - 如何在 win32 进程中显示 'memory used' 的百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2510881/

相关文章:

c++ - 重复常量 c_strings 是否重复?

CS50 - 加载 - 尝试执行加载时从无处获取随机字符

c - 如何从 C 中的 "raw"内存中读取/写入类型值?

c++ - 为什么它不能创建子窗口?

linux - 无法启动 : The running command stopped because the preference variable "ErrorActionPreference" or common parameter is set to Stop

windows - 重新打开对话框时,访问键是否应保留下划线?

c# - IRandomAccessStream 与流

windows - 在 IntelliJ Community Edition 和 Tomcat8 上调试 J2EE 应用程序(作为服务运行)

c# - 打开另一个应用程序的系统菜单

c++ - 像 Photoshop CS 一样管理窗口 Z 顺序