windows用getprocessmemoryinfo获取peakworkingsetsize(字节),linux读/proc/[pid]/status的vmhwm(kb),二者语义不同:前者含共享页,后者去重统计rss峰值,不可直接跨平台统一。

Windows下用 GetProcessMemoryInfo 读取 PeakWorkingSetSize
Windows 平台最直接的方式是调用 psapi.h 中的 GetProcessMemoryInfo,它返回的 PROCESS_MEMORY_COUNTERS 结构体里有 PeakWorkingSetSize 字段,单位是字节,代表进程自启动以来占用物理内存(Working Set)的峰值。
注意:这个值不是“物理内存独占量”,而是该进程曾驻留在 RAM 中的最大工作集大小,含共享页(如系统 DLL),但不含已换出到页面文件的部分。
- 必须链接
Psapi.lib,否则链接失败 - 需要先用
OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, ...)获取句柄,权限缺一不可 - 32 位程序在 64 位系统上默认无法获取 64 位进程信息,需启用
Wow64DisableWow64FsRedirection或改用 64 位编译 -
PeakWorkingSetSize是只读快照,不会实时更新,每次调用都返回当前记录的峰值
Linux下解析 /proc/[pid]/status 中的 VmHWM
Linux 没有等价的系统 API,得靠读取 /proc/self/status(当前进程)或 /proc/[pid]/status(其他进程),其中 VmHWM 行表示 “High Water Mark” 的物理内存使用峰值,单位是 KB。
这个值对应内核中 mm->hiwater_rss,统计的是 RSS(Resident Set Size)历史最高值,比 Windows 的 Working Set 更贴近“实际占物理内存”的概念,不含共享库的重复计数(按实际映射页计算)。
- 务必检查
open()和read()返回值,/proc文件可能因权限或进程退出而不存在 - 不要用
fscanf直接匹配,VmHWM:后可能有空格或制表符,建议逐行读 +sscanf(line, "VmHWM: %lu kB", &hwm) - 在容器中运行时,
VmHWM反映的是宿主机视角的 RSS 峰值,不受 cgroup memory limit 影响(但超限会导致 OOM kill)
跨平台封装要注意的三个兼容性坑
想写个通用函数?别急着抽象。Windows 和 Linux 的这两个指标语义不一致,强行统一单位或命名会误导监控逻辑。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
PeakWorkingSetSize包含共享页;VmHWM按实际驻留页去重统计 —— 同一进程在两系统上报的数值可能差 20%~50% - Linux 的
VmHWM在进程退出后即清零;Windows 的PeakWorkingSetSize会一直保留到进程句柄关闭,多次调用始终返回同一峰值 - macOS 完全不提供类似接口,
task_info只能拿到当前resident_size,没有峰值字段,硬要跨三端就得自己采样+维护最大值
为什么不用 GetPerformanceInfo 或 /proc/meminfo
有人试过 GetPerformanceInfo(Windows)或读取全局 /proc/meminfo(Linux),但这俩给的是系统级内存状态,和单个进程无关。前者返回的是整个系统的 Working Set 信息,后者是全局物理内存统计,完全无法定位到你的进程。
也有人想用 EnumProcessModules + GetModuleInformation 算模块大小,这只能得到代码段/数据段的虚拟大小,和实际物理内存占用毫无关系 —— 页面可能被换出、可能被共享、也可能根本没加载进 RAM。
真正有效的只有进程粒度的专用接口:GetProcessMemoryInfo 和 /proc/[pid]/status,其他路径全是绕远路还走错方向。
物理内存峰值这种指标,本质依赖 OS 内核在分配/释放页时埋点更新。用户态没权限也没能力自己推算,信系统给的,别自己猜。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










