【问题标题】:How to determine a process "virtual size" (WinXP)?如何确定一个进程的“虚拟大小”(WinXP)?
【发布时间】:2010-10-07 14:56:25
【问题描述】:

我有一个程序需要大量内存,一旦达到 2GB 虚拟地址空间,它就会崩溃。 Sysinternals 进程资源管理器将此显示为“虚拟大小”列。 如何使用 C(或 C++)代码确定这个“虚拟大小”?

好的,我必须查询“虚拟字节”的性能计数器。 Perfmon 将查询字符串(或它的调用方式)显示为,例如,在我的德语 Win XP 安装中,'\Process(firefox)\Virtuelle Größe'。

如何确定“当前进程”的查询字符串,是否有非本地化名称?

【问题讨论】:

    标签: c++ c windows memory-management


    【解决方案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。

        【讨论】:

        • 我知道。问题是,我离极限还有多远。
        猜你喜欢
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-26
        • 2011-10-09
        相关资源
        最近更新 更多