Linux下可通过读取/proc/self/status获取进程RSS和VSZ:VmRSS字段值为物理内存(KB),VmSize字段值为虚拟内存(KB),需用istringstream提取数值以适配内核格式变化。

Linux 下用 /proc/self/status 读取物理内存(RSS)和虚拟内存(VSZ)
Linux 系统中,每个进程的内存使用信息都实时暴露在 /proc/[pid]/status 里,当前进程可直接读 /proc/self/status。关键字段是 VmRSS(物理内存,单位 KB)和 VmSize(虚拟内存,单位 KB)。
注意:这不是 C++ 标准能力,必须依赖 Linux /proc 接口;Windows 不适用。
实操建议:
- 用
std::ifstream打开/proc/self/status,逐行读取,匹配以VmRSS:和VmSize:开头的行 - 字段后数值前可能有多个空格或制表符,建议用
std::istringstream+>>自动跳过空白并提取整数 - 不要依赖固定列偏移或正则——不同内核版本格式微调过,只认字段名加冒号
- 示例片段:
std::ifstream f("/proc/self/status"); std::string line; while (std::getline(f, line)) { if (line.rfind("VmRSS:", 0) == 0) { std::istringstream iss(line); std::string _; int kb; iss >> _ >> kb; std::cout << "RSS = " << kb << " KB\n"; } }
macOS 怎么获取等效的物理/虚拟内存?用 task_info() + TASK_BASIC_INFO_64
macOS 没有 /proc,得走 Mach API。task_info() 调用配合 TASK_BASIC_INFO_64 可拿到 resident_size(近似 RSS)和 virtual_size(虚拟内存大小)。
立即学习“C++免费学习笔记(深入)”;
常见错误现象:直接传 mach_task_self() 却忘了链接 -framework Foundation -framework CoreServices,或漏掉 #include <mach/task.h> 和 <mach/mach_init.h>。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
实操建议:
- 结构体要用
TASK_BASIC_INFO_64_COUNT计算 size,不能硬写sizeof(task_basic_info_data_t)(32/64 位不一致) - 返回值必须检查:成功是
KERN_SUCCESS,否则字段无效 -
resident_size是“驻留集大小”,不含 swap,最接近 Linux 的 RSS;virtual_size包含所有映射区域(包括未分配的 virtual memory),和VmSize语义一致
Windows 上用 GetProcessMemoryInfo() 获取工作集和私有字节数
Windows 没有直接对应 RSS/VSZ 的概念,但 GetProcessMemoryInfo() 返回的 PROCESS_MEMORY_COUNTERS_EX 中:WorkingSetSize 近似 RSS,PrivateUsage 更反映进程独占的物理+虚拟页(含已提交未访问页),而 VirtualSize 字段已被弃用,不可靠。
容易踩的坑:
- 必须用
PROCESS_MEMORY_COUNTERS_EX,不是旧版PROCESS_MEMORY_COUNTERS——后者没有PrivateUsage - 调用前要
#include <psapi.h>并链接Psapi.lib;Windows 7+ 才支持EX版本 -
WorkingSetSize会受系统内存压力影响动态收缩,瞬时值波动大;如需稳定参考,可结合GetPerformanceInfo()看全局内存状态
跨平台封装要注意什么?别试图统一单位或语义
物理内存和虚拟内存在不同系统底层含义就有差异:Linux VmRSS 包含共享库的已用页,macOS resident_size 默认不计共享页,Windows WorkingSetSize 则包含共享但当前被锁住的部分。强行“对齐”只会引入误导。
实操建议:
- 对外接口按平台原生语义暴露字段,命名带平台标识,例如
rss_linux_kb()、working_set_windows_bytes() - 避免封装成“get_physical_memory()”这种黑盒函数——调用方需要知道它到底代表什么
- 如果只是做监控告警,优先用
WorkingSetSize(Windows)、VmRSS(Linux)、resident_size(macOS)三者各自最稳定的指标,不强求横向比较
真正难的从来不是读哪个文件或调哪个 API,而是理解你拿到的数字在当前系统里究竟计入了什么、被谁共享、是否包含缓存页——这些细节文档往往一笔带过,只能查内核源码或反复验证行为。

















