3

任何看过 Mark Russovich 演讲“揭开内存管理之谜”的人都知道,vmmap 工具可以向您展示一些其他工具似乎不知道的与您的进程限制(香草 32 位窗口上为 2GB)有关的东西。

我希望能够以编程方式监控我的的实际总内存大小(与进程限制密切相关的内存大小),这样我至少可以记录接近进程限制时发生的情况。是否有任何关于 vmmap 如何做到这一点的公开信息?

...另外,为什么这些信息如此难以获得?

我所知道的事情(AFAIK)并没有给你完整的画面:

  • ::GetProcessMemoryInfo 看起来它只返回有关私有内存使用情况的信息
  • System.Diagnostics.Process.VirtualMemorySize64 返回一个相当大的数字,但仍然与 vmmap 显示的总数不完全匹配——实际上它与 vmmap 中显示的任何内容都不匹配 :(
4

2 回答 2

4

我使用Dependency Walker查看从哪些 Windows API 函数导入Kernel32.dllvmmap.exe并发现以下可能相关的函数:

VirtualAlloc
VirtualAllocEx
VirtualFree
VirtualProtectEx
VirtualQueryEx

看看那些,看看你是否能找到vmmap正在做的事情。当然,任何其他动态进行的 API 调用(即 via LoadLibrary)都不会出现在依赖遍历器中。在处理并行加载的 DLL 时,它也会被破坏。

于 2013-05-03T19:14:44.600 回答
3

在twpol/vmmap中有一个类似 VMMap 的功能的开源命令行实现,它成功地显示了与 SysInternals VMMap 所做的有关进程的所有相同信息。

另请参阅实现快速堆枚举的这个 fork,但我没有亲自测试过这个。

于 2018-10-02T21:54:11.820 回答