linux用/proc/self/statm读取resident页数,结合/proc/meminfo的memtotal计算物理内存占用百分比;windows调用getprocessmemoryinfo获取workingsetsize,配合globalmemorystatusex算百分比;跨平台需处理解析陷阱与错误返回。

Linux下用/proc/self/statm读取物理内存占用
Linux系统里,/proc/self/statm 是最轻量、最常用的方式,它直接返回以页为单位的内存使用数据,不需要额外依赖。文件第一列是总内存页数(size),第二列是常驻内存页数(resident),后者才是真正被加载到物理内存的部分。
注意:statm 中的页大小是 getpagesize() 返回值(通常是 4096 字节),不是虚拟内存总量;也不能直接除以系统总内存算百分比——必须先读取 /proc/meminfo 中的 MemTotal: 行。
- 用
std::ifstream读/proc/self/statm,提取第二列(resident) - 再读
/proc/meminfo,匹配MemTotal:后的数值(单位 kB) - 换算:
percent = (resident * getpagesize()) / (mem_total_kb * 1024.0) * 100.0 - 务必检查文件是否可读,
/proc在容器或某些受限环境可能不可见
Windows下调用GetProcessMemoryInfo获取工作集大小
Windows 没有统一的“内存占用百分比”概念,GetProcessMemoryInfo 返回的 WorkingSetSize 最接近用户感知的“当前占用了多少物理内存”,但它不等于系统级内存使用率——这个值受系统内存压力影响很大,同一进程在空闲和高负载机器上差异可达数倍。
要算百分比,需配合 GlobalMemoryStatusEx 获取 ullTotalPhys(总物理内存字节数)。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 链接
Psapi.lib,包含<psapi.h></psapi.h>和<windows.h></windows.h> - 调用前确保
HANDLE是当前进程(GetCurrentProcess()) -
WorkingSetSize是近似值,可能滞后于实际,不适合高频采样(如每毫秒调用) - 返回值为 0 时要检查
GetLastError(),常见原因是权限不足或 UWP 进程限制
跨平台封装要注意的三个陷阱
写一个 get_memory_usage_percent() 函数时,最容易出错的不是计算逻辑,而是边界条件和隐式假设。
- Linux 下
/proc/meminfo的MemTotal:可能含空格或单位缩写(如MemTotal: 16324568 kB),不能用简单std::stoi直接解析整行 - Windows 下
PROCESS_MEMORY_COUNTERS_EX比PROCESS_MEMORY_COUNTERS多字段且更准,但要求_WIN32_WINNT >= 0x0501,否则编译失败 - 无论哪边,返回值都应是
std::optional<double></double>或带错误码,因为任意一步 IO 或 API 调用都可能失败,硬返回 0.0 会掩盖问题
为什么不用top或ps命令解析结果
调用 std::system("ps -o rss= -p $$") 看起来简单,但实际非常脆弱。
- shell 环境不可控(比如
$$在 dash/sh 下行为不同,busybox 的 ps 不支持-o) - 启动新进程开销大,频繁调用会导致 CPU 和 fork 压力明显上升
- 输出格式无保证:不同版本
ps对空白、单位、精度处理不一致,正则容易崩 - 权限问题:容器中可能根本没
ps,或者被 seccomp 禁掉clone系统调用
真需要兼容性兜底,也该用 libprocps 这类静态链接库,而不是拼字符串跑命令。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










