必须直接读取 /proc/meminfo,因其是 linux 上唯一稳定、无需特权、实时且格式受内核保证的内存信息接口;memtotal 和 memavailable 字段分别提供准确的总内存与可用内存(kb),解析时需严格匹配前缀并截取数值,降级时按公式估算但须校验字段完整性。

直接读 /proc/meminfo,别绕路。这是 Linux 上唯一稳定、无需特权、实时且被内核保证格式的接口,比 sysconf(_SC_PHYS_PAGES) 或 sysinfo() 更准——后者只给页数,不告诉你哪些页真能用。
为什么必须用 /proc/meminfo 而不是其他 API
Linux 没有“获取总内存/可用内存”的系统调用。POSIX 接口如 sysconf(_SC_PHYS_PAGES) 只返回物理页总数,单位是页,还得自己乘 getpagesize(),而且完全不反映缓存、预留、不可用页等真实约束。sysinfo() 的 freeram 字段虽语义接近,但依赖内核版本和配置,某些发行版(如部分容器镜像)甚至禁用该字段。而 /proc/meminfo 是内核主动维护的伪文件,每行含义明确、格式固定、所有主流发行版默认启用。
-
MemTotal:是内核实际识别并管理的物理内存总量(单位 kB),它已经扣除了 BIOS/UEFI 预留、内核自身占用、iommu 映射等不可用部分 -
MemAvailable:是内核 3.14+ 引入的估算值,综合了MemFree、可回收的PageCache、SReclaimable等,比MemFree + Buffers + Cached更可靠 - 字段后固定带冒号和空格,例如
MemAvailable: 1234567 kB,解析时必须跳过冒号后第一个非空格字符开始的数字
如何安全提取 MemTotal 和 MemAvailable 的数值
逐行读取 /proc/meminfo,匹配开头为 MemTotal: 和 MemAvailable: 的行。别用正则或整行 sscanf——字段名可能被缩写(极罕见但存在),且空格数量不固定;也别信任 free 命令输出,它的列顺序在不同版本中会变。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
std::ifstream打开文件,std::getline()逐行读取 - 对每行调用
line.find("MemTotal:") == 0或line.find("MemAvailable:") == 0判断前缀 - 找到后用
line.substr(pos + 9)(MemTotal:长度为 9)或line.substr(pos + 13)(MemAvailable:长度为 13)截取剩余部分 - 再用
std::stoll()解析首个连续数字,**不要用atoi()** ——32GB 内存对应约 33,554,432 kB,int会溢出 - 单位始终是 kB,转字节需乘
1024LL,转 GiB 除以1024LL * 1024LL * 1024LL
MemAvailable 缺失时怎么降级处理
内核低于 3.14(如 CentOS 6、旧嵌入式系统)不提供 MemAvailable: 行。此时不能直接 fallback 到 MemFree:,它通常只有几十 MB,严重低估可用性。手动估算误差大,但仍是唯一选择。
- 需同时提取
MemFree:、Buffers:、Cached:、SReclaimable:四个字段 - 粗略公式:
available_kb = memfree + buffers + cached + sreclaimable - shmem(Shmem:是共享内存,不可回收) - 注意:老内核可能没有
SReclaimable:,就跳过;Shmem:若不存在,按 0 处理 - 这种估算在数据库或 Java 进程大量使用 page cache 时偏差可达 20% 以上,建议在日志中标记 “fallback to manual estimate”
- 若任一字段缺失,整个估算应视为无效,返回
-1或抛异常,别硬凑一个假值
真正容易被忽略的点是:/proc/meminfo 不是普通文件,每次 open() 都触发内核实时统计,频繁读(比如每 10ms 一次)会增加 vfs 开销。如果要做高频监控,缓存 int fd = open("/proc/meminfo", O_RDONLY) 句柄,用 lseek(fd, 0, SEEK_SET) 重置位置再 read(),比反复 open/close 快且轻量。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










