free 命令的 used 值不等于程序实际占用内存,真正关键指标是 Available;它表示当前可立即分配且不影响性能的内存估算值,只要该值远大于 0 就无需担心内存不足。

free 命令显示的内存占用,不能直接等同于“程序用了多少内存”。它反映的是系统整体内存使用状态,但关键指标容易被误解——比如看到 used 很高就以为内存快爆了,其实 Linux 的内存管理逻辑和直觉相反:用得越满,往往说明缓存利用越充分,系统越高效。
看懂 free 输出的核心三行:Mem、Swap、Available
运行 free -h(加 -h 以人类可读格式显示),重点关注这三行:
-
Mem 行:物理内存总体情况。其中
used= 总内存 −free−buff/cache,但它包含内核、进程、页缓存、slab 等所有已分配内存,不等于“被应用独占”的内存。 - buff/cache:缓冲区(buffer)和页缓存(cache)之和。这部分内存可被随时回收,用于加载文件、加速磁盘读写。Linux 会尽可能填满它,属于“聪明地用”,不是“浪费”。
- Available(重点!):这是最该关注的数字。它表示在不影响系统性能的前提下,当前可立即分配给新进程的内存估算值(考虑了可回收 cache、slab 等)。只要这个值远大于 0,就不必担心内存不足。
为什么 used 高 ≠ 内存紧张?
Linux 把空闲内存视为“浪费”,会主动用它做 page cache(例如读取过的文件内容)、dentries/inodes 缓存、slab 分配器缓存等。这些都计入 used,但一旦有进程申请内存,内核会快速释放部分 cache 来满足需求。
- 例如:你刚执行过
find /usr -name "*.so",buff/cache可能猛增 1GB,used跟着涨——但这只是把空闲内存转成了加速后续文件访问的缓存,不是泄漏。 - 真正危险的信号是:
Available持续接近 0,且Swap使用量不断上升(si/so列非零),或出现 OOM killer 日志(dmesg | grep -i "killed process")。
辅助判断:结合其他命令交叉验证
单靠 free 不足以定位谁在吃内存,需配合:
-
top或htop:按M键按内存使用排序,看RES(常驻内存)列,注意区分真实应用内存和共享库占用。 -
smem -w:比ps更准确统计实际内存占用(支持 USS、PSS 计算),能排除共享内存重复计算问题。 -
cat /proc/meminfo:查看详细分类,如Slab、SReclaimable(可回收 slab)、PageTables、CommitLimit等,适合深入排查。
常见误操作与建议
别一看到 used 高就去“清缓存”——那反而降低性能:
- ❌ 手动执行
echo 3 > /proc/sys/vm/drop_caches:强制清空 page cache、dentries 和 inodes。除非调试或测试,否则没必要,清完立刻变慢。 - ✅ 关注趋势而非瞬时值:用
free -h -w 2每 2 秒刷新,观察Available是否持续下降、Swap是否增长。 - ✅ 检查是否有内存泄漏进程:长时间运行后
RES持续上涨、VSZ异常大、无对应业务负载,可能是 bug 或配置错误(如 Java 应用堆设过大又没压测)。










