
字节笔记本
2026年10月7日 · 约 9 分钟读完
还能分出去的是 available
free -h 一行里有六列,真正能给新进程用的是 available,不是 free。对话里那次输出是:总内存 7.8Gi,used 2.6Gi,free 3.7Gi,shared 1.0Mi,buff/cache 1.4Gi,available 4.8Gi,Swap 全是 0B。看 free 那一列会把还能回收的缓存算成已经用掉。

六列各自是什么
total 是这块机器的物理内存,这里是 7.8Gi。used 是当前算作已用的 2.6Gi。free 是完全没被占用的 3.7Gi。shared 是共享内存,这里只有 1.0Mi。buff/cache 是缓冲区和页缓存,1.4Gi,内核拿来加速磁盘,内存紧张时可以收回。available 是估计还能给新进程的量,4.8Gi。它比 free 大,因为把可以收回的缓存算了进去。
Swap 那一行三个数都是 0B,表示没有交换空间。物理内存还够时,这行是 0 并不表示机器已经坏了。对话里的建议是可以配一小块交换,用来挡住突然的尖峰。交换放在磁盘上,比内存慢,配得很大时,系统会在磁盘上来回倒页,整体变慢。这一次的数字不需要为了“看起来有 swap”去划一大块。
-h 把字节换成 Gi、Mi。不要拿没加 -h 的输出和这组数字比大小,单位不同。
看 CPU 不要用 free
内存用 free -h,也可以看 /proc/meminfo。CPU 是另一组命令。对话里列了 lscpu 和 cat /proc/cpuinfo 看处理器规格,top 和 htop 看正在跑的进程。vmstat 看虚拟内存和简单的运行队列。uptime 看负载。glances 把几类数放在一个画面里。
top 同时有 CPU 和内存,所以两边的清单里都出现了它。只想回答“还剩多少内存”,free -h 够用,不必先打开 top。lscpu 告诉你有几颗、几核,不告诉你现在忙不忙。现在忙不忙看 top 里的百分比,或者 uptime 的负载。负载和核数要一起看,单看一个数没有“高”或“低”。
htop 和 glances 可能没装。命令不存在时,先用 top、free、lscpu,这三样在常见发行版里都有。不要因为增强工具缺失就认为系统不提供内存信息。
用 available 判断紧不紧
这次 available 是 4.8Gi,free 是 3.7Gi,中间那 1Gi 左右就在缓存里。新进程需要内存时,内核可以收回缓存。只盯着 free 下降,会把正常的页缓存误判成泄漏。used 上升、available 还宽,同样先别杀进程。
available 掉到接近 0,同时 Swap 仍是 0,下一步才危险:没有交换空间时,内核只能挑进程结束。所以对话里对 0B 的交换给出“可以配一小块”的建议,针对的是尖峰,不是把 7.8Gi 里的空闲再划走一半。
共享内存只有 1.0Mi,说明这次没有大块的进程间共享。buff/cache 1.4Gi 和 available 4.8Gi 对得上“缓存还在、但仍能分出去”的状态。这是一次宽裕的快照,不是持续监控。过一小时再跑一次 free -h,才能说它稳不稳定。

把这一行数字对上命令
终端里先跑 free -h,读到的就是这次的六列。Mem 行:total 7.8Gi,used 2.6Gi,free 3.7Gi,shared 1.0Mi,buff/cache 1.4Gi,available 4.8Gi。Swap 行全是 0B。把 available 抄下来当“还能分多少”,把 free 只当作“完全没人用的空页”。两者差出来的部分,主要就是还能收回的缓存。用 used 加 free 去对 total,中间还隔着缓存和共享,对不齐是正常的,不要据此认为命令算错。
接着看规格和当下占用,两条命令不要混。lscpu 或 cat /proc/cpuinfo 回答有多少处理器。top 或装了之后的 htop 回答现在谁在用 CPU、谁在用内存。vmstat 给的是一小段时间里的运行队列和内存计数,适合看是不是在抖,不适合替代 free 的那一行总账。uptime 只给负载和运行了多久。glances 把这些挤在一屏,没安装就退回前面几条。
判断要不要加交换,只看两件事:available 是否已经贴近 0,以及 Swap 是不是仍为 0。这次 available 还有 4.8Gi,总内存 7.8Gi,不属于贴近 0。Swap 为 0 是事实,对话建议的是一小块,用来接住短时间的尖峰。磁盘上的交换比内存慢,划得接近物理内存那么大,机器会在压力下把时间花在换页上。所以这次快照的结论是内存宽裕,交换可以以后再配一小块,不是现在就把空闲内存划走。
过一段时间再跑一次 free -h。若 available 明显小于这一次的 4.8Gi,再把两次的 used 和 buff/cache 放在一起看。缓存变大、available 还稳,多半是正常的页缓存。available 跟着掉、free 也掉,才像是进程把内存留下来不还。单次快照分不出这两种。
先读 available,再决定要不要交换
free -h 里用 available 回答“还能开新进程吗”。这次是 4.8Gi,free 的 3.7Gi 偏小,是因为 1.4Gi 在 buff/cache。Swap 为 0 表示没有交换空间。物理内存还宽时不必划一大块交换。CPU 用 lscpu 看规格,用 top 看当下占用。/proc/meminfo 和 /proc/cpuinfo 是不依赖额外安装的原文。
读数时按列名,不按从左到右的第几列去记。不同版本的 free 列顺序若有出入,列名仍是 total、used、free、shared、buff/cache、available。这次 Mem 的具体数字是 7.8Gi、2.6Gi、3.7Gi、1.0Mi、1.4Gi、4.8Gi。Swap 是 0B、0B、0B。available 4.8Gi 大于 free 3.7Gi,多出来的来自还能收回的缓存,不是凭空多出来的内存。shared 只有 1.0Mi,说明这次没有大块共享。
CPU 命令和这行无关。lscpu 看规格,top 看当下,uptime 看负载,vmstat 看一小段抖动。htop 和 glances 没有就不用。不要用内存宽裕推断 CPU 空闲,也不要用负载高推断必须加交换。交换只和“物理内存顶满且没有 swap”有关。这次还没顶满。一小块交换是对话针对 0B 那一行的建议,不是把 7.8Gi 再划出一大半。隔一段时间再跑 free -h,和这一次的 available 对比,单次快照不构成泄漏结论。
把这次输出写成一张可以核对的单。物理内存大约七点八吉,已用大约二点六吉,完全空闲大约三点七吉。共享大约一点零兆,缓冲和缓存大约一点四吉,估计还能分给新进程的大约四点八吉。交换三列都是零。完全空闲小于还能分配的量,是因为缓存还能收回,不是统计重复计算。共享几乎可以忽略。处理器规格用专门的信息命令看,当下谁占着处理器用实时列表看,负载用运行时间那一条看。增强界面没装就跳过。内存宽裕不能推出处理器空闲。交换区只在物理内存顶满而且当前没有交换时才有意义,这次离顶满还远。若以后要加,只留一小块接尖峰,不要按整机内存的规模去划磁盘。隔一段时间再采一次,和这一次的可分配量比较。一次采样不能称作泄漏。缓冲变大而可分配量还稳,多半是页缓存在工作。因此内存那一行只回答还能不能再开进程。处理器忙不忙要另开实时列表。负载要另看运行了多久的那一条。三件事分开读,不要互相代替。共享列小到可以跳过不查。页缓存上升不等于泄漏。先看可分配量,再决定内存有没有顶满。所以这一次的内存还没有顶满。



