windows无直接物理内存峰值api,需用getprocessmemoryinfo读peakworkingsetsize并自行维护最大值;linux通过/proc/self/status的vmhwm字段获取进程级物理内存峰值(单位kb),该值内核维护、只增不减。

Windows 上没有直接暴露“物理内存占用峰值”的系统 API,GetProcessMemoryInfo 和 GlobalMemoryStatusEx 都只提供瞬时快照,历史峰值需应用自行记录;Linux 下 /proc/meminfo 也不保存峰值,真正可用的峰值数据仅存在于内核运行时状态中,用户态无法直接读取。
Windows:用 GetProcessMemoryInfo + 自行累加跟踪峰值
Windows 的 PROCESS_MEMORY_COUNTERS_EX 结构里 PeakWorkingSetSize 字段是当前进程生命周期内的最大工作集(近似物理内存峰值),但它只在进程退出时才被内核最终确定——运行中调用该函数返回的是“到目前为止观测到的最大值”,不是绝对可靠的终态峰值,但对监控场景已足够实用。
- 必须启用
PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限才能成功调用,否则GetProcessMemoryInfo返回FALSE,GetLastError()为ERROR_ACCESS_DENIED -
PeakWorkingSetSize单位是字节,不是 KB 或 MB,别漏掉换算 - 它反映的是工作集(working set),即驻留在物理内存中的页,不等于
PrivateUsage(私有提交内存),二者语义不同:前者可被系统回收,后者是进程独占的虚拟内存总量 - 示例关键片段:
PROCESS_MEMORY_COUNTERS_EX pmc = {0}; pmc.cb = sizeof(pmc); if (GetProcessMemoryInfo(GetCurrentProcess(), (PPROCESS_MEMORY_COUNTERS)&pmc, sizeof(pmc))) { size_t peak_kb = pmc.PeakWorkingSetSize / 1024; }
Linux:解析 /proc/[pid]/statm 和 /proc/meminfo 的组合局限
Linux 没有进程级物理内存峰值记录接口。/proc/[pid]/statm 第二列 resident 是当前驻留物理页数(单位为页),但它是瞬时值;/proc/[pid]/status 中的 VmHWM(High Water Mark)字段才是真正的物理内存使用峰值(单位 KB),它从进程启动后持续更新,且只增不减——这才是你要找的可靠指标。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
cat /proc/self/status | grep VmHWM可直接验证当前进程峰值,注意输出格式为VmHWM: 123456 kB,需跳过前缀并处理空格 -
VmHWM是内核维护的统计量,无需特权,普通用户进程可读 - 不要误用
VmPeak(虚拟内存峰值)替代物理内存峰值,二者差一个数量级很常见 - 频繁读取
/proc/[pid]/status有轻微开销,生产环境建议采样间隔 ≥ 100ms,避免stat系统调用风暴
跨平台统一监控的现实取舍:为什么不能只靠系统 API
所谓“系统级物理内存占用峰值”本身是个模糊概念:它可能是整个系统的峰值(如 MemAvailable 最低点),也可能是某进程的峰值,还可能是容器 cgroup 的峰值。三者数据来源完全不同,无法用一套接口覆盖。
- 系统全局峰值需自己轮询
/proc/meminfo(Linux)或GlobalMemoryStatusEx(Windows),并维护最小AvailPhys值——但该值受缓存/备用页影响,不代表真实压力 - Docker 容器需读
/sys/fs/cgroup/memory/memory.max_usage_in_bytes(v1)或/sys/fs/cgroup/memory.peak(v2),路径和语义与宿主机完全隔离 - C++ 无标准库支持这些路径读取,必须用
std::ifstream或open()/read(),且要处理文件不存在、权限拒绝、读取中断等错误分支 - 所有峰值数据都是“自上次重置以来”,而内核不会自动重置——除非你手动写
0到memory.max_usage_in_bytes(不推荐)
真正难的不是读哪个字段,而是定义清楚“你要监控的峰值到底属于谁、生命周期多长、是否需要持久化、出阈值后怎么归因”。VmHWM 和 PeakWorkingSetSize 虽然名字像,但一个在内核里实时更新,一个在用户态快照缓存,行为边界稍不注意就会误判 OOM 根因。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










