如何在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
相关产品推荐
相关产品推荐

