{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/cpp-windows-process-memory-usage/",
  "atlas": "https://www.pystone.net/?node=cpp-windows-process-memory-usage#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/cpp-windows-process-memory-usage.md",
  "context": "https://www.pystone.net/notes/cpp-windows-process-memory-usage.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:cpp-windows-process-memory-usage",
  "slug": "cpp-windows-process-memory-usage",
  "title": "Windows C++ 获取进程内存使用情况",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "Windows C++ 获取进程内存使用情况",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "4f69353219f55760f4e41c7da657b7c9cf6b30979ac2df4644f373cfab945d06",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "Windows C++ 获取进程内存使用情况",
      "anchor": "windows-c-获取进程内存使用情况",
      "citation": "https://www.pystone.net/notes/cpp-windows-process-memory-usage/#windows-c-%E8%8E%B7%E5%8F%96%E8%BF%9B%E7%A8%8B%E5%86%85%E5%AD%98%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5"
    },
    {
      "depth": 2,
      "text": "查询当前进程",
      "anchor": "查询当前进程",
      "citation": "https://www.pystone.net/notes/cpp-windows-process-memory-usage/#%E6%9F%A5%E8%AF%A2%E5%BD%93%E5%89%8D%E8%BF%9B%E7%A8%8B"
    },
    {
      "depth": 2,
      "text": "查询指定 PID",
      "anchor": "查询指定-pid",
      "citation": "https://www.pystone.net/notes/cpp-windows-process-memory-usage/#%E6%9F%A5%E8%AF%A2%E6%8C%87%E5%AE%9A-pid"
    },
    {
      "depth": 2,
      "text": "分析建议",
      "anchor": "分析建议",
      "citation": "https://www.pystone.net/notes/cpp-windows-process-memory-usage/#%E5%88%86%E6%9E%90%E5%BB%BA%E8%AE%AE"
    },
    {
      "depth": 2,
      "text": "参考资料",
      "anchor": "参考资料",
      "citation": "https://www.pystone.net/notes/cpp-windows-process-memory-usage/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:programming-languages-and-runtimes",
      "title": "编程语言与运行时",
      "url": "https://www.pystone.net/notes/programming-languages-and-runtimes/",
      "atlas": "https://www.pystone.net/?node=programming-languages-and-runtimes#knowledge-atlas",
      "label": "编程语言与运行时",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "C++中的“C++获取内存使用情况”导航项",
      "citation": "https://www.pystone.net/notes/programming-languages-and-runtimes/#c"
    }
  ],
  "contentMarkdown": "# Windows C++ 获取进程内存使用情况\n\n> 创建时间：2020/5/14 22:18\n\nWindows 可通过 PSAPI 的 `GetProcessMemoryInfo` 读取进程内存计数器。常用字段包括：\n\n- `WorkingSetSize`：当前驻留在物理内存中的工作集；其中可能包含共享页面。\n- `PeakWorkingSetSize`：进程生命周期内的工作集峰值。\n- `PrivateUsage`：`PROCESS_MEMORY_COUNTERS_EX` 提供的私有提交量，更接近该进程独自承担的已提交内存，但仍不等同于所有分析工具中的 “private working set”。\n- `PageFaultCount`：累计缺页次数，不能单独代表性能问题。\n\n不同工具的“内存占用”可能采用工作集、私有工作集、提交量或 PSS 等不同口径，比较前必须确认定义。\n\n## 查询当前进程\n\n```cpp\n#include <windows.h>\n#include <psapi.h>\n\n#include <cstddef>\n#include <iostream>\n\n#pragma comment(lib, \"psapi.lib\")\n\nint main() {\n    PROCESS_MEMORY_COUNTERS_EX counters{};\n    counters.cb = sizeof(counters);\n\n    const BOOL ok = GetProcessMemoryInfo(\n        GetCurrentProcess(),\n        reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&counters),\n        sizeof(counters));\n\n    if (!ok) {\n        std::cerr << \"GetProcessMemoryInfo failed, error=\"\n                  << GetLastError() << '\\n';\n        return 1;\n    }\n\n    constexpr std::size_t MiB = 1024 * 1024;\n    std::cout << \"Working set: \"\n              << counters.WorkingSetSize / MiB << \" MiB\\n\";\n    std::cout << \"Peak working set: \"\n              << counters.PeakWorkingSetSize / MiB << \" MiB\\n\";\n    std::cout << \"Private commit: \"\n              << counters.PrivateUsage / MiB << \" MiB\\n\";\n}\n```\n\n## 查询指定 PID\n\n打开其他进程时只申请查询所需的最小权限，并检查句柄与 API 返回值：\n\n```cpp\n#include <windows.h>\n#include <psapi.h>\n\n#include <iostream>\n\n#pragma comment(lib, \"psapi.lib\")\n\nbool PrintProcessMemory(DWORD processId) {\n    HANDLE process = OpenProcess(\n        PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ,\n        FALSE,\n        processId);\n\n    if (process == nullptr) {\n        std::cerr << \"OpenProcess failed, error=\" << GetLastError() << '\\n';\n        return false;\n    }\n\n    PROCESS_MEMORY_COUNTERS_EX counters{};\n    counters.cb = sizeof(counters);\n    const BOOL ok = GetProcessMemoryInfo(\n        process,\n        reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&counters),\n        sizeof(counters));\n\n    if (ok) {\n        std::cout << \"PID \" << processId\n                  << \", working set=\" << counters.WorkingSetSize\n                  << \" bytes, private commit=\" << counters.PrivateUsage\n                  << \" bytes\\n\";\n    } else {\n        std::cerr << \"GetProcessMemoryInfo failed, error=\"\n                  << GetLastError() << '\\n';\n    }\n\n    CloseHandle(process);\n    return ok == TRUE;\n}\n```\n\n某些受保护进程无法读取，提升到 `SeDebugPrivilege` 也不是通用解决方案。工具应正常处理访问被拒绝，并避免默认以管理员身份运行。\n\n## 分析建议\n\n1. 固定构建、场景和采样时间，重复采样而非只看单点。\n2. 同时记录工作集、私有提交量和系统整体内存压力。\n3. 排查泄漏时结合堆快照、分配调用栈和对象生命周期。\n4. 64 位大小使用 `SIZE_T`/`std::size_t`，避免用 `%d` 截断。\n5. 句柄必须关闭；动态数组应使用标准容器或 RAII，避免手工 `new[]`/`delete[]` 错配。\n\n## 参考资料\n\n- [Microsoft Learn：GetProcessMemoryInfo](https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getprocessmemoryinfo)\n- [Microsoft Learn：Process Memory Usage Information](https://learn.microsoft.com/en-us/windows/win32/psapi/process-memory-usage-information)\n"
}
