You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中获取Windows进程的Private Working Set内存

Windows平台通过PID获取进程Private Working Set的方案

核心结论

无法通过Working Set直接计算出Private Working Set的值——Working Set包含进程占用的所有内存页(包括与其他进程共享的部分),而Private Working Set是仅属于该进程、不与其他进程共享的内存页,两者没有固定的换算关系,必须直接获取。

PROCESS_MEMORY_COUNTERS的局限性

你之前使用的PROCESS_MEMORY_COUNTERS结构体仅能获取WorkingSetSize(整个工作集大小),它并没有提供Private Working Set的相关字段,因此这个结构本身无法满足需求,需要使用其扩展版本。

推荐方案:使用PROCESS_MEMORY_COUNTERS_EX结构体

通过GetProcessMemoryInfo函数配合PROCESS_MEMORY_COUNTERS_EX扩展结构体,可以直接获取Private Working Set的值,该结构体中的PrivateUsage字段与任务管理器显示的Private Working Set完全对应。

C++代码示例

#include <windows.h>
#include <psapi.h>
#include <iostream>

#pragma comment(lib, "psapi.lib")

int main(int argc, char* argv[]) {
    if (argc != 2) {
        std::cout << "使用方式: " << argv[0] << " <目标进程PID>" << std::endl;
        return 1;
    }

    DWORD pid = atoi(argv[1]);
    // 打开进程,需要PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
    if (!hProcess) {
        std::cout << "OpenProcess调用失败,错误码: " << GetLastError() << std::endl;
        return 1;
    }

    PROCESS_MEMORY_COUNTERS_EX pmc;
    memset(&pmc, 0, sizeof(pmc));
    pmc.cb = sizeof(pmc); // 必须初始化结构体大小

    if (GetProcessMemoryInfo(hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc))) {
        // 转换为KB单位输出,与任务管理器显示格式一致
        std::cout << "Private Working Set: " << pmc.PrivateUsage / 1024 << " KB" << std::endl;
    } else {
        std::cout << "GetProcessMemoryInfo调用失败,错误码: " << GetLastError() << std::endl;
    }

    CloseHandle(hProcess);
    return 0;
}

备选方案:WMI查询

如果是脚本场景或需要更灵活的监控方式,可以使用WMI的Win32_Process类,其中PrivatePageCount属性对应Private Working Set。

PowerShell示例

$targetPid = 1234 # 替换为目标进程的PID
$process = Get-WmiObject -Class Win32_Process -Filter "ProcessId = $targetPid"
$privateWorkingSetKB = $process.PrivatePageCount / 1024
Write-Host "Private Working Set: $privateWorkingSetKB KB"

总结

  • 不要尝试通过Working Set推导Private Working Set,两者的内存组成逻辑不同,没有可靠的换算方式。
  • PROCESS_MEMORY_COUNTERS不足以获取Private Working Set,必须使用扩展的PROCESS_MEMORY_COUNTERS_EX结构体。
  • 优先选择GetProcessMemoryInfo + PROCESS_MEMORY_COUNTERS_EX的方式,性能更优,适合原生程序开发;WMI方式适合快速脚本或跨语言场景。

内容的提问来源于stack exchange,提问作者Euchidna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:01:41