windows 用 getprocessmemoryinfo 获取 peakworkingsetsize,linux 读 /proc/self/status 的 vmhwm,二者均反映进程生命周期内物理内存占用最高值,单位分别为字节和 kb,无需特权权限,且值只增不减直至进程退出。

Windows 直接用 GetProcessMemoryInfo 读 PeakWorkingSetSize,Linux 读 /proc/self/status 的 VmHWM 字段——两者都反映进程生命周期内物理内存占用的最高值,且无需 root 或管理员权限。
Windows 下用 GetProcessMemoryInfo 获取峰值工作集
Windows 的 PROCESS_MEMORY_COUNTERS 结构体里,PeakWorkingSetSize 是唯一可靠记录进程历史最大物理内存占用的字段。它和 WorkingSetSize 同源,但只增不减,直到进程退出才重置。
-
PeakWorkingSetSize单位是字节,直接除以 1024 可得 KB;注意它包含共享库页(如ntdll.dll),不是纯私有堆内存 - 必须链接
psapi.lib,否则链接时报unresolved external symbol GetProcessMemoryInfo - 结构体
cb字段必须设为sizeof(PROCESS_MEMORY_COUNTERS),否则函数返回FALSE且不填值 - 该值在进程启动后首次内存分配时即开始统计,不需要额外初始化或触发行为
Linux 下读 /proc/self/status 的 VmHWM
Linux 内核从 2.6.32 起在 /proc/self/status 中提供 VmHWM(High Water Mark)字段,单位是 kB,含义与 Windows 的 PeakWorkingSetSize 完全对应。
-
VmHWM是自进程启动以来 RSS 达到过的最大值,不是当前值;它比VmRSS更稳定,适合做内存超限判断 - 不要用
/proc/self/statm第二列算峰值——statm不提供历史最大值,只有瞬时 resident 页数 - 解析时需跳过行尾空格和单位,推荐用
sscanf(line, "VmHWM: %ld kB", &hwm_kb),避免字符串截取出错 - 该字段在容器中同样有效,只要内核支持 procfs(所有主流发行版均支持)
跨平台封装时绕开 mallinfo 和 getrusage
这两个接口常被误认为能获取峰值内存,但实际不可靠:
-
mallinfo在 glibc 2.33+ 已废弃,只统计 malloc 分配器内部状态,完全忽略mmap、线程栈、共享库等大头内存 -
getrusage(RUSAGE_SELF, &ru)的ru_maxrss字段在 Linux 上单位是 KB,但某些内核版本(如部分 Android kernel 或旧 CentOS)会返回 0 或错误值;Windows 根本不支持 - 二者都不区分“峰值物理内存”和“峰值虚拟内存”,语义模糊,无法替代
PeakWorkingSetSize/VmHWM
真正容易被忽略的是:峰值内存值不会自动归零或重置,哪怕你后续释放了全部内存;它只代表“历史上最多同时驻留在 RAM 中多少字节”。监控告警时,应关注其是否持续增长,而非单次读取就判定泄漏。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











