我有一个需要大量内存的程序,一旦达到2GB虚拟地址空间就会崩溃。Sysinternals 进程监视器将其显示为“虚拟大小”列。如何使用C(或C++)代码确定此“虚拟大小”?
好的,我需要查询一个“虚拟字节”性能计数器。在我的德国Win XP安装版本中,Perfmon显示查询字符串(或称之为)为'\Process(firefox)\Virtuelle Größe'。
如何确定“当前进程”的查询字符串,并且是否有非本地化名称?
我有一个需要大量内存的程序,一旦达到2GB虚拟地址空间就会崩溃。Sysinternals 进程监视器将其显示为“虚拟大小”列。如何使用C(或C++)代码确定此“虚拟大小”?
好的,我需要查询一个“虚拟字节”性能计数器。在我的德国Win XP安装版本中,Perfmon显示查询字符串(或称之为)为'\Process(firefox)\Virtuelle Größe'。
如何确定“当前进程”的查询字符串,并且是否有非本地化名称?
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
保存了该进程的虚拟内存大小。我需要和theller一样的东西,但不幸的是我需要它用于除了我的进程之外的其他进程。因此,theller使用“MEMORYSTATUSEX.ullTotalVirtual–MEMORYSTATUSEX.ullAvailVirtual”的自我回答对我没有用,因为返回MEMORYSTATUXEX的函数GlobalMemoryStatusEx()只适用于当前进程。
到目前为止,我还没有找到完全符合我的要求而不使用性能计数器的方法(我没有深入研究它们,因为它们看起来比我要找的东西复杂得多)。通过循环并使用“VirtualQueryEx”来探索所需进程的地址空间,计算所有状态不为MEM_FREE的区域数量,我已经非常接近了。在我的测试中,与Process Explorer相比,它似乎高出17M,...而且肯定不是无竞争条件的。
总之,我知道这可能不是一个答案,但我想至少记录一下我在这方面取得的进展,以便下一个遇到这个问题的人可以参考。
你不需要性能计数器。 只需使用NAPI(Win32 FAQ)
请查看win32组新闻://nntp.aioe.org/comp.os.ms-windows.programmer.win32 获取C代码。