如何确定一个进程的“虚拟大小”(WinXP)?
Posted
技术标签:
【中文标题】如何确定一个进程的“虚拟大小”(WinXP)?【英文标题】:How to determine a process "virtual size" (WinXP)? 【发布时间】:2010-10-07 14:56:25 【问题描述】:我有一个程序需要大量内存,一旦达到 2GB 虚拟地址空间,它就会崩溃。 Sysinternals 进程资源管理器将此显示为“虚拟大小”列。 如何使用 C(或 C++)代码确定这个“虚拟大小”?
好的,我必须查询“虚拟字节”的性能计数器。 Perfmon 将查询字符串(或它的调用方式)显示为,例如,在我的德语 Win XP 安装中,'\Process(firefox)\Virtuelle Größe'。
如何确定“当前进程”的查询字符串,是否有非本地化名称?
【问题讨论】:
【参考方案1】:我需要和 theller 一样的东西,但不幸的是,我需要它用于我自己的过程之外的过程。因此,使用“MEMORYSTATUSEX.ullTotalVirtual–MEMORYSTATUSEX.ullAvailVirtual”的自我回答对我不起作用,因为 GlobalMemoryStatusEx()(返回 MEMORYSTATUXEX 的函数)仅适用于当前进程。
到目前为止,如果不使用性能计数器,我一直无法准确找到我正在寻找的东西(我没有进入那些,因为它们看起来比我要寻找的要复杂得多)。通过循环并使用“VirtualQueryEx”来探索所需进程的地址空间,我非常接近,计算了所有没有 MEM_FREE 状态的区域。在我的测试中,与 Process Explorer 相比,它似乎比我预期的高出 17M。 ...而且,它当然不是无竞争条件的。
无论如何,我知道这是一个无法回答的问题,但我想我至少会记录下我在这方面取得的进展,以供下一个偶然发现的人使用。
【讨论】:
我一直在试图弄清楚同样的事情。除了将消息管道或窗口消息添加到我正在监视的其他进程之外,我还有新的想法。【参考方案2】:您不需要性能计数器。 只需使用 NAPI(Win32 常见问题解答)
见上win32群新闻://nntp.aioe.org/comp.os.ms-windows.programmer.win32 用于 C 代码。
【讨论】:
【参考方案3】:根据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
保存着进程的虚拟机大小。
【讨论】:
我猜这将是 ProcessExplorer 在“私有字节”列中显示的内容,所以这不是我要找的内容。 PROCESS_MEMORY_COUNTERS_EX.PrivateUsage 根据msdn.microsoft.com/en-us/library/aa965225(VS.85).aspx 与任务管理器中的VM Size 相同。 虽然VM Size也不是我要找的,你提到的MSDN页面有我需要的东西:MEMORYSTATUSEX.ullTotalVirtual–MEMORYSTATUSEX.ullAvailVirtual 我们需要像“虚拟大小”一样的 Process-Explorer,因为这是预测失败的度量。可以确认:MEMORYSTATUSEX.ullTotalVirtual–MEMORYSTATUSEX.ullAvailVirtual 给出相同的数字。【参考方案4】:您可以使用性能计数器。 Process 对象具有“虚拟字节”值。
【讨论】:
IIUC,GetProcessMemoryInfo 不提供 this 信息。【参考方案5】:您查询性能计数器。 win32 API 中有一个完整的 API,read about it here。 如果您运行一个名为“perfmon.exe”的程序,您可以查看所有性能计数器
【讨论】:
【参考方案6】:在 32 位 WindowsXP 中,地址空间分为两部分 2GB:一部分用于程序,另一部分用于内核。您可以使用/3GB switch in the boot.ini file 将应用程序部分增加到 3GB。
【讨论】:
我知道。问题是,我离极限还有多远。以上是关于如何确定一个进程的“虚拟大小”(WinXP)?的主要内容,如果未能解决你的问题,请参考以下文章