在 64 位 Windows Server 2003 上,我可以使用 taskmgr 或进程资源管理器看到总提交费用约为 3.5GB,但是当我对每个进程消耗的私有字节数求和时(通过运行pslist -m并添加Priv列下的所有值)总容量为 1.6GB。
我知道哪个进程似乎导致了这个(sqlservr.exe),因为当我终止该进程时,提交费用急剧下降。然而,有问题的进程只消耗了约 220MB 的私有字节,但终止进程会使提交费用降低约 1.6GB。
这怎么可能?提交费用怎么会比 Private Bytes 大得多,后者应该代表提交的内存量?如果其他一些因素导致提交费用,那么该因素是什么,我如何在流程浏览器中查看其影响?
注意:我声称我已经理解保留内存和提交内存之间的区别:我上面的调查特别涉及私有字节,它只包括提交的内存,不包括保留的内存。在这种情况下,进程的虚拟大小超过 4GB,但这应该无关紧要 - procexp 中的虚拟大小代表保留的、未提交的内存,不应参与提交费用。
我对这个问题的一般答案特别感兴趣:我假设如果 sqlservr.exe 可以以这种方式运行,那么任何进程都可能会这样做。
我注意到,尽管 Procexp 报告了 220MB 的私有字节,但将 Sysinternals VMMap 指向此进程报告了1.6GB的已提交“私有数据”。鉴于“Windows® Sysinternals 管理员参考”中有关此字段的文档指出:
私有数据内存是由 VirtualAlloc 分配的内存,不由堆管理器或 .NET 运行时进一步处理,或分配给堆栈类别... VMMap 对“私有数据”的定义比 Process Explorer 的定义更精细“私人字节。” Procexp 的“私有字节”包括属于该进程的所有私有提交内存。
即 VMMap 提交的“私有数据”应该小于 procexp 的“私有字节”。
此外,在阅读 Mark Russinovich 出色的Pushing the Limits of …