最轻量可靠的方式是读取/proc/meminfo,因其提供内核实时维护的内存水位数据;sysconf()等POSIX函数仅返回静态硬件信息,无法反映实际使用量。

Linux 下直接读 /proc/meminfo 是最轻量、最可靠的方式,无需额外依赖或 root 权限,C++ 只需标准文件流即可完成。
为什么不用 sysconf() 或 get_phys_pages()
这些 POSIX 函数只能拿到总物理内存(_SC_PHYS_PAGES)或页大小,完全不反映当前使用量。它们返回的是静态硬件信息,和“已用多少内存”无关。真正要监控内存水位,必须走 /proc/meminfo —— 这是内核实时维护的唯一权威来源。
-
MemTotal:总可用内存(排除预留 kernel space、firmware 等) -
MemAvailable:真实可立即分配的内存(比MemFree更准,含可回收 cache) -
MemFree:完全未被使用的内存页,日常几乎总是极小值,**别用它判断内存压力** -
Buffers/Cached/SwapCached:属于可回收内存,不应简单加总到“已用”里
如何安全解析 /proc/meminfo 的 key-value 行
该文件格式固定:每行形如 MemTotal: 16256404 kB,冒号后有不定空格,单位恒为 kB(注意不是 KB)。解析失败常见于忽略空格跳过或单位硬编码错误。
- 用
std::ifstream逐行读,避免一次性加载(虽然文件很小,但习惯要对) - 用
std::string::find(':')定位冒号,再用substr()截取右侧;之后调std::stoi()前务必trim()(手动跳过前导空格) - 单位只认
"kB",遇到"mB"或无单位直接跳过——内核从不输出这些 - 不要依赖行序:
MemAvailable在较老内核(MemFree + Buffers + Cached 粗略估算)
C++ 示例:提取 MemAvailable 和 MemTotal(单位 kB)
#include <fstream>
#include <string>
#include <sstream>
#include <map>
std::map<std::string, long> parse_meminfo() {
std::map<std::string, long> result;
std::ifstream f("/proc/meminfo");
std::string line;
while (std::getline(f, line)) {
auto pos = line.find(':');
if (pos == std::string::npos) continue;
std::string key = line.substr(0, pos);
std::string value_part = line.substr(pos + 1);
// trim leading spaces
size_t first = value_part.find_first_not_of(" \t");
if (first == std::string::npos) continue;
value_part = value_part.substr(first);
// expect "123456 kB"
std::istringstream iss(value_part);
long val;
std::string unit;
if (iss >> val && iss >> unit && unit == "kB") {
result[key] = val;
}
}
return result;
}
// 使用:
auto mem = parse_meminfo();
long total = mem["MemTotal"];
long avail = mem.count("MemAvailable") ? mem["MemAvailable"] :
mem["MemFree"] + mem["Buffers"] + mem["Cached"];
注意 MemAvailable 是 Linux 3.14+ 引入的,若读不到,上面 fallback 公式只是经验近似,实际可用性低于原生值——这点在容器环境或 memory cgroup 限制下偏差更大,不能用于精确资源调度决策。
立即学习“C++免费学习笔记(深入)”;



















