- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我知道内存使用在 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 世界...您将如何实现它?
请记住,重点是向用户表明它正在变得“危险”,他们应该释放内存或重新启动应用程序。也许“使用百分比”不是解决此问题的最佳方法?什么是?我的另一个想法是基于颜色的系统(红色、黄色、绿色,我可以基于更多因素而不仅仅是一个数字)
最佳答案
是的,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/
我是一名优秀的程序员,十分优秀!