真正空闲的是available字段,它表示内核估算的可立即分配给新进程的内存,包含free和可回收的buff/cache;free列仅指完全未使用的裸空闲页,参考价值低。

free -h 输出里哪些字段才算“真正空闲”
很多人看到 free 命令输出里的 free 列就以为是“还能用的内存”,其实不是。这一列只表示完全没被任何用途占用的物理页,现实中几乎总偏小——Linux 会把空闲内存优先用于 buffers 和 cache,提升 I/O 效率。真正能立刻分配给新进程的,是 available 列。
这个值由内核估算得出,考虑了可回收的 page cache、slab、tmpfs 等,并排除了不可回收的 dirty pages 和 locked pages。只要它没跌破总内存的 10%,通常不需干预。
-
free:裸空闲页,日常运维中参考价值低 -
available:关键指标,代表当前可立即分配的内存上限 -
buffers + cache:大部分可随时释放,不是“浪费”,而是内核的主动缓存策略
/proc/meminfo 里怎么查更细粒度的空闲状态
当 free -h 不够用(比如想确认是否因 dirty pages 导致 available 被压低),直接读 /proc/meminfo 更可靠。它提供原始内核统计,字段含义明确:
-
MemAvailable:和free命令的available列一致,是最终可用估算值 -
MemFree:对应free命令的free列,纯空闲页 -
Buffers:块设备 I/O 缓冲区,可回收 -
Cached:page cache(文件缓存),大部分可回收 -
SReclaimable:可回收的 slab 内存(如 dentry/inode 缓存) -
Dirty:已修改但尚未写回磁盘的页,这部分会拖慢available回升速度
执行 cat /proc/meminfo | grep -E "^(MemAvailable|MemFree|Buffers|Cached|SReclaimable|Dirty)" 就能快速聚焦这些字段。
为什么 top 或 htop 显示的“free memory”和 free -h 不一样
top 默认顶部显示的 “free” 是 MemFree + Buffers + Cached 的粗略加总,没有扣除不可回收部分(比如 dirty pages、locked pages、tmpfs 占用),所以数值往往比 free -h 的 available 高出不少,容易误判。
-
htop默认显示的是available(新版),更贴近真实可用量 -
top的 “free” 是历史遗留逻辑,不能等同于available - 如果
top显示 free 很高但系统已开始 swap,说明大量 cache 是 dirty 或 locked,无法释放
空闲内存突然变少?先看是不是被 tmpfs 或 ramfs 占了
tmpfs(比如 /dev/shm、/run)和 ramfs 使用的是物理内存,但不计入 used,也不影响 available 的计算逻辑——它们占用的空间从一开始就“不算空闲”。这类内存不会自动释放,必须手动清理或重启服务。
- 检查
df -h -t tmpfs,看是否有异常大的挂载点 - 查看
/dev/shm下是否有残留大文件:ls -lh /dev/shm/ - 确认 systemd 的
RuntimeDirectoryMax是否被设得过大,导致/run持续膨胀
这类问题不会在 free 的 used 或 available 中直接体现,但实际挤占了物理内存空间。











