我有一个需要大量内存的程序,只要达到2GB的虚拟地址空间就会崩溃。 Sysinternals进程管理器将其显示为“虚拟大小”列。如何用C(或C++)代码确定这个“虚拟大小”?如何确定一个进程“虚拟大小”(WinXP)?
好吧,我必须查询“虚拟字节”的性能计数器。 Perfmon在我的德语Win XP安装中显示查询字符串(或其调用方式),例如'\ Process(firefox)\ VirtuelleGröße'。
如何确定'当前进程'的查询字符串,并且是否存在非本地化名称?
我有一个需要大量内存的程序,只要达到2GB的虚拟地址空间就会崩溃。 Sysinternals进程管理器将其显示为“虚拟大小”列。如何用C(或C++)代码确定这个“虚拟大小”?如何确定一个进程“虚拟大小”(WinXP)?
好吧,我必须查询“虚拟字节”的性能计数器。 Perfmon在我的德语Win XP安装中显示查询字符串(或其调用方式),例如'\ Process(firefox)\ VirtuelleGröße'。
如何确定'当前进程'的查询字符串,并且是否存在非本地化名称?
根据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大小。
您查询性能计数器。
在win32 API中有一个完整的API,read about it here。
如果您运行名为'perfmon.exe'的程序,您可以查看所有性能计数器。
您没有代码片段吗? – theller 2009-02-14 09:28:36
在32位WindowsXP地址空间被分成两个2GB部分:一部分用于程序,另一部分用于内核。您可以使用/3GB switch in the boot.ini file将应用程序部分增加到3GB。
我知道。问题是,我距离极限还有多远。 – theller 2009-02-14 09:29:16
您不需要性能计数器。 只需使用NAPI(Win32的FAQ)
看到的Win32集团新闻://nntp.aioe.org/comp.os.ms-windows.programmer.win32 的C代码。
我需要和勒姆一样的东西,但不幸的是我需要它以外的其他过程。因此,由于GlobalMemoryStatusEx()(返回MEMORYSTATUXEX的函数)仅适用于当前进程,因此使用“MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual”的自我回答不适用于我。
到目前为止,我一直无法找到我正在寻找的东西,而没有使用性能计数器(我没有涉及这些因为他们看起来比我所寻找的方式更复杂)。通过循环使用“VirtualQueryEx”来探索所需进程的地址空间,将所有没有MEM_FREE状态的区域计算在内,我非常接近。在我的测试中,它比我比预期的Process Explorer高出17M。 ......而且,这当然不是无竞赛条件的。
无论如何,我知道这是一个无法回答的问题,但我想我至少会记录下我在这方面取得的进展。
我想这将是什么ProcessExplorer显示在'私人字节'列,所以它不是我在找什么。 – theller 2009-02-14 10:28:31