繁体   English   中英

如何确定进程“虚拟大小”(WinXP)?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM