我有一个需要大量内存的程序,一旦达到2GB虚拟地址空间就会崩溃。 Sysinternals进程资源管理器将其显示为“虚拟大小”列。 如何用C(或C ++)代码确定这个“虚拟大小”?
好的,我必须查询“虚拟字节”的性能计数器。 Perfmon在我的德语Win XP安装中显示查询字符串(或它的调用方式),例如'\ Process(firefox)\VirtuelleGröße'。
如何确定“当前流程”的查询字符串,是否有非本地化名称?
答案 0 :(得分:8)
根据MSDN: Memory Performance Information PROCESS_MEMORY_COUNTERS_EX.PrivateUsage
与Windows XP中任务管理器中的VM大小相同。 GetProcessMemoryInfo应该有效:
PROCESS_MEMORY_COUNTERS_EX pmcx = {};
pmcx.cb = sizeof(pmcx);
GetProcessMemoryInfo(GetCurrentProcess(),
reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmcx), pmcx.cb);
现在pmcx.PrivateUsage
保存进程的VM大小。
答案 1 :(得分:1)
您查询性能计数器 win32 API中有一个完整的API,read about it here 如果运行名为“perfmon.exe”的程序
,则可以查看所有性能计数器答案 2 :(得分:1)
您可以使用效果计数器。 Process对象具有“虚拟字节”值。
答案 3 :(得分:1)
我需要与theller相同的东西,但遗憾的是它需要一个非我自己的过程。因此,theller使用“MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual”的自答案对我不起作用,因为GlobalMemoryStatusEx()(返回MEMORYSTATUXEX的函数)仅适用于当前进程。
到目前为止,在没有使用性能计数器的情况下,我一直无法找到我想要的内容(我没有进入那些因为它们看起来比我想要的更复杂)。我通过循环并使用“VirtualQueryEx”来探索所需进程的地址空间,计算所有没有MEM_FREE状态的区域。在我的测试中,与Process Explorer相比,它似乎比我预期的高17M。 ......此外,它肯定不是无竞争条件的。
无论如何,我知道这不是一个非答案,但我想我至少会记录下我为此发现的事情所取得的进展。
答案 4 :(得分:0)
在32位WindowsXP地址空间分为两个2GB部分:一部分用于程序,另一部分用于内核。您可以使用/3GB switch in the boot.ini file将应用程序部分增加到3GB。
答案 5 :(得分:0)
您不需要性能计数器。 只需使用NAPI(Win32常见问题解答)
见win32群组新闻://nntp.aioe.org/comp.os.ms-windows.programmer.win32 对于C代码。