linux下用/proc/self/status读取vmrss(kb)最直接,windows需调用getprocessmemoryinfo获取workingsetsize(字节),二者均反映当前物理内存占用,但跨平台时应分层提供原始值而非硬算百分比。

Linux 下用 /proc/self/status 读取 VmRSS 是最直接的方式
Linux 系统中,每个进程的内存使用信息都暴露在 /proc/[pid]/status 里,当前进程可用 /proc/self/status 访问。真正反映“实际物理内存占用”的是 VmRSS 字段(单位 KB),它比 VmSize(虚拟内存)更贴近用户关心的“运行内存占用”。注意:这不是百分比,需自行除以系统总内存。
常见错误是误读 VmSize 或 VmPeak——前者含未分配页、mmap 映射等,后者是历史峰值,都不能代表当前真实占用。
- 用
std::ifstream打开/proc/self/status,逐行查找以VmRSS:开头的行 - 用
std::stoi或strtol提取 KB 数值,别漏掉后面的KB字符 - 系统总内存建议从
/proc/meminfo读MemTotal:,单位也是 KB - 计算比例时注意整数除法截断,建议转
double运算并乘 100.0
Windows 下必须调用 GetProcessMemoryInfo(psapi.h)
Windows 没有统一的伪文件系统接口,不能靠读文件。必须用 Windows API:GetProcessMemoryInfo 填充 PROCESS_MEMORY_COUNTERS 结构体,其中 WorkingSetSize 字段(单位字节)最接近 Linux 的 VmRSS——即当前被映射进物理内存、可被立即访问的页集合。
容易踩的坑:链接时忘记加 psapi.lib,或没在工程中定义 WIN32_LEAN_AND_MEAN 导致头文件冲突;另外 PagefileUsage 是提交量,不是实际占用,别混淆。
- 包含
<windows.h></windows.h>和<psapi.h></psapi.h> - 用
GetCurrentProcess()获取当前句柄 - 结构体大小要显式传
sizeof(PROCESS_MEMORY_COUNTERS),否则 API 可能失败返回 0 -
WorkingSetSize是近似值,受系统内存管理策略影响,短时间多次调用可能波动
跨平台封装时别硬算“内存占用比例”,先确认需求本质
所谓“内存占用比例”本身是个模糊概念:是占物理内存?还是容器限制(如 cgroup)?还是 Docker 的 memory.limit_in_bytes?不同场景分母完全不同。直接返回一个百分比数字反而容易误导。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
更稳妥的做法是分层提供接口:底层返回原始字节数(VmRSS / WorkingSetSize),上层由业务决定分母——比如监控程序用系统总内存,容器内程序则优先查 /sys/fs/cgroup/memory/memory.limit_in_bytes。
- 避免在库函数里写死除以
sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE),该值在容器中不准确 - Linux 容器环境应优先检查
/sys/fs/cgroup/memory/下是否存在memory.limit_in_bytes且不等于9223372036854771712(即 “-1” 的 unsigned 表示) - Windows WSL2 用户要注意:若程序跑在 WSL2 内,仍应走 Linux 路径,而非 Windows API
别忽略采样时机和精度问题
内存占用是瞬时快照,VmRSS 和 WorkingSetSize 都非原子更新。频繁读取(如每毫秒)不仅开销大,数据也无意义——内核不会为每次读做同步刷新。
典型误用是把它当 CPU 使用率一样做实时图表渲染。实际上,除非调试内存泄漏,否则秒级采样已足够;且两次读数差值小于几 MB 时,基本属于正常抖动,不应报警。
- 生产环境建议采样间隔 ≥ 1s,避免 I/O 和解析开销累积
- Linux 下
/proc/self/status是内核动态生成,单次读开销小,但频繁 open/read/close 仍会触发 vfs 层路径查找 - Windows 下
GetProcessMemoryInfo是轻量系统调用,但比纯内存访问慢 1–2 个数量级,别在 tight loop 里调
实际部署时,最容易被忽略的是容器环境下的分母选择——用 MemTotal 算出来的“12%”在 8GB 宿主机上跑一个内存 limit 为 512MB 的容器里,完全不具备参考价值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










