2009-02-14 54 views
10

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

好吧,我必须查询“虚拟字节”的性能计数器。 Perfmon在我的德语Win XP安装中显示查询字符串(或其调用方式),例如'\ Process(firefox)\ VirtuelleGröße'。

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

回答

8

根据MSDN: Memory Performance InformationPROCESS_MEMORY_COUNTERS_EX.PrivateUsage与Windows XP中任务管理器中的虚拟机大小相同。 GetProcessMemoryInfo应该工作:

PROCESS_MEMORY_COUNTERS_EX pmcx = {}; 
pmcx.cb = sizeof(pmcx); 
GetProcessMemoryInfo(GetCurrentProcess(), 
    reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmcx), pmcx.cb); 

现在pmcx.PrivateUsage保持处理的VM大小。

+0

我想这将是什么ProcessExplorer显示在'私人字节'列,所以它不是我在找什么。 – theller 2009-02-14 10:28:31

1

您查询性能计数器。
在win32 API中有一个完整的API,read about it here
如果您运行名为'perfmon.exe'的程序,您可以查看所有性能计数器。

+0

您没有代码片段吗? – theller 2009-02-14 09:28:36

1

您可以使用性能计数器。 Process对象具有“虚拟字节”值。

+1

IIUC,GetProcessMemoryInfo不提供*此*信息。 – theller 2009-02-14 09:29:59

+0

你是对的。纠正。 – 2009-02-14 09:43:46

0

在32位WindowsXP地址空间被分成两个2GB部分:一部分用于程序,另一部分用于内核。您可以使用/3GB switch in the boot.ini file将应用程序部分增加到3GB。

+0

我知道。问题是,我距离极限还有多远。 – theller 2009-02-14 09:29:16

0

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

看到的Win32集团新闻://nntp.aioe.org/comp.os.ms-windows.programmer.win32 的C代码。

1

我需要和勒姆一样的东西,但不幸的是我需要它以外的其他过程。因此,由于GlobalMemoryStatusEx()(返回MEMORYSTATUXEX的函数)仅适用于当前进程,因此使用“MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual”的自我回答不适用于我。

到目前为止,我一直无法找到我正在寻找的东西,而没有使用性能计数器(我没有涉及这些因为他们看起来比我所寻找的方式更复杂)。通过循环使用“VirtualQueryEx”来探索所需进程的地址空间,将所有没有MEM_FREE状态的区域计算在内,我非常接近。在我的测试中,它比我比预期的Process Explorer高出17M。 ......而且,这当然不是无竞赛条件的。

无论如何,我知道这是一个无法回答的问题,但我想我至少会记录下我在这方面取得的进展。