[英]How to determine a process “virtual size” (WinXP)?
我有一个需要大量内存的程序,一旦达到2GB虚拟地址空间就会崩溃。 Sysinternals进程资源管理器将其显示为“虚拟大小”列。 如何用C(或C ++)代码确定这个“虚拟大小”?
好的,我必须查询“虚拟字节”的性能计数器。 Perfmon在我的德语Win XP安装中显示查询字符串(或它的调用方式),例如'\\ Process(firefox)\\VirtuelleGröße'。
如何确定“当前进程”的查询字符串,是否有非本地化名称?
根据MSDN:内存性能信息 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 Size。
我需要与theller相同的东西,但遗憾的是它需要它来进行我自己以外的过程。 因此,由于GlobalMemoryStatusEx()(返回MEMORYSTATUXEX的函数)仅适用于当前进程,因此使用“MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual”的自我回答并不适合我。
到目前为止,如果不使用性能计数器,我一直无法找到我想要的东西(我没有进入那些因为它们看起来比我想要的更复杂)。 我通过循环并使用“VirtualQueryEx”来探索所需进程的地址空间,计算所有没有状态MEM_FREE的区域。 在我的测试中,与Process Explorer相比,它似乎比我预期的高17M。 ......而且,它肯定不是无竞争条件的。
无论如何,我知道这不是一个非答案,但我想我至少会记录我为此做出的进展,无论谁发现了下一个。
您查询性能计数器。
在win32 API中有一个完整的API, 请在此处阅读 。
如果运行名为“perfmon.exe”的程序,可以查看所有性能计数器
您可以使用性能计数器。 Process Object具有“Virtual Bytes”值。
在32位WindowsXP地址空间分为两个2GB部分:一部分用于程序,另一部分用于内核。 您可以使用boot.ini文件中的/ 3GB开关将应用程序部分增加到3GB。
您不需要性能计数器。 只需使用NAPI(Win32 FAQ)
请参阅win32组新闻://nntp.aioe.org/comp.os.ms-windows.programmer.win32获取C代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.