如何确定一个进程的“虚拟大小”(WinXP)?

10

我有一个需要大量内存的程序,一旦达到2GB虚拟地址空间就会崩溃。Sysinternals 进程监视器将其显示为“虚拟大小”列。如何使用C(或C++)代码确定此“虚拟大小”?

好的,我需要查询一个“虚拟字节”性能计数器。在我的德国Win XP安装版本中,Perfmon显示查询字符串(或称之为)为'\Process(firefox)\Virtuelle Größe'。

如何确定“当前进程”的查询字符串,并且是否有非本地化名称?

6个回答

9
根据MSDN: 内存性能信息PROCESS_MEMORY_COUNTERS_EX.PrivateUsage在Windows XP中与任务管理器中的VM Size相同。 GetProcessMemoryInfo应该可以使用:
PROCESS_MEMORY_COUNTERS_EX pmcx = {};
pmcx.cb = sizeof(pmcx);
GetProcessMemoryInfo(GetCurrentProcess(),
    reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmcx), pmcx.cb);

现在,pmcx.PrivateUsage 保存了该进程的虚拟内存大小。

我猜这将是ProcessExplorer在“私有字节”列中显示的内容,所以这不是我要找的。 - theller
根据http://msdn.microsoft.com/en-us/library/aa965225(VS.85).aspx,PROCESS_MEMORY_COUNTERS_EX.PrivateUsage与任务管理器中的VM Size相同。 - dalle
7
虽然 VM 大小不是我想要的,但你提到的 MSDN 页面包含我需要的内容:MEMORYSTATUSEX.ullTotalVirtual–MEMORYSTATUSEX.ullAvailVirtual - theller
1
我们需要与“虚拟大小”类似的Process-Explorer,因为这是预测失败的度量标准。 可以确认: MEMORYSTATUSEX.ullTotalVirtual - MEMORYSTATUSEX.ullAvailVirtual 给出相同的数字。 - MartinP

1

我需要和theller一样的东西,但不幸的是我需要它用于除了我的进程之外的其他进程。因此,theller使用“MEMORYSTATUSEX.ullTotalVirtual–MEMORYSTATUSEX.ullAvailVirtual”的自我回答对我没有用,因为返回MEMORYSTATUXEX的函数GlobalMemoryStatusEx()只适用于当前进程。

到目前为止,我还没有找到完全符合我的要求而不使用性能计数器的方法(我没有深入研究它们,因为它们看起来比我要找的东西复杂得多)。通过循环并使用“VirtualQueryEx”来探索所需进程的地址空间,计算所有状态不为MEM_FREE的区域数量,我已经非常接近了。在我的测试中,与Process Explorer相比,它似乎高出17M,...而且肯定不是无竞争条件的。

总之,我知道这可能不是一个答案,但我想至少记录一下我在这方面取得的进展,以便下一个遇到这个问题的人可以参考。


我一直在尝试找出同样的事情。除了将消息管道或窗口消息添加到我正在监视的其他进程中,我已经没有更多的想法了。 - Mike Caron

1

您可以查询性能计数器。
在win32 API中,有一个完整的API可供使用,在此处阅读有关它的信息
如果您运行一个名为“perfmon.exe”的程序,您可以查看所有的性能计数器。


1
你可以使用性能计数器。进程对象有一个“虚拟字节”值。

1
如果我理解正确,GetProcessMemoryInfo不提供这个信息。 - theller

0
在32位的Windows XP中,地址空间被分为两个2GB的部分:一个部分用于程序,另一个部分用于内核。您可以使用boot.ini文件中的/3GB开关将应用程序部分增加到3GB。

我知道这一点。问题是,我离极限还有多远。 - theller

0

你不需要性能计数器。 只需使用NAPI(Win32 FAQ)

请查看win32组新闻://nntp.aioe.org/comp.os.ms-windows.programmer.win32 获取C代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接