6_内存管理入门:看懂 Linux 的 “内存占用”
内存管理入门:看懂 Linux 的 “内存占用”
很多新手打开 Linux 的内存监控工具时,总会被 “used 很高、free 很低” 吓一跳 ——“我的内存是不是快满了?会不会卡?” 其实 Linux 的内存管理逻辑和 Windows 不一样,“used 高” 不代表 “内存不够用”。今天这篇文章,带你搞懂 Linux 内存的 “结构密码”,用 2 个核心命令看懂内存占用,再通过实战解决 “内存紧张” 问题,新手也能轻松上手。
一、先搞懂:Linux 的内存长啥样?物理内存 + swap 分区
Linux 的内存由两部分组成:物理内存(电脑实际插的内存条)和swap 分区(硬盘上划分的 “虚拟内存”),可以用 “书桌 + 抽屉” 的类比理解:
内存类型 | 类比场景 | 核心作用 | 特点 |
---|---|---|---|
物理内存 | 书桌桌面 | 存放正在运行的程序 / 数据(比如打开的浏览器、终端) | 速度快(毫秒级),容量有限(比如 8GB/16GB) |
swap 分区 | 书桌抽屉 | 物理内存不够时,临时存放不常用的程序 / 数据 | 速度慢(秒级,依赖硬盘),容量可自定义(比如 8GB/16GB) |
简单说:Linux 会优先用 “速度快的物理内存” 运行程序,当物理内存快满时,会把 “暂时不用的程序” 挪到 swap 分区(相当于 “把暂时不用的书放进抽屉”),腾出物理内存给需要的程序;当之前的程序需要运行时,再从 swap 挪回物理内存(“把书从抽屉放回桌面”)。
新手注意:swap 不是 “没用的备胎”—— 比如你同时开了浏览器、IDE、数据库,物理内存不够时,swap 能避免程序直接崩溃;但频繁用 swap 会让系统变卡(因为硬盘速度远不如内存),这是判断 “内存是否真的紧张” 的关键信号。
二、核心命令:2 个命令看懂内存 “现状 + 波动”
要管理内存,先得 “看见” 内存 ——free
命令看当前内存状态,vmstat
命令看内存实时波动,两个命令搭配用,能全面掌握内存情况。
1. free:查看内存占用(重点学free -h
)
free
命令能显示物理内存、swap 分区的使用情况,新手一定要加-h
参数(“human-readable”,用 GB/MB 显示单位,更直观)。
(1)基础用法:free -h
-
命令:
free -h
-
输出结果解读(以 8GB 物理内存、8GB swap 为例):
  total used free shared buff/cache available
Mem: 7.7Gi 2.1Gi 1.2Gi 384Mi 4.4Gi 5.0Gi
Swap: 7.9Gi 0B 7.9Gi
每一列的含义(新手重点记total
/used
/available
/Swap
):
-
Mem(物理内存):
-
total
:总物理内存(7.7Gi,接近 8GB,系统会预留少量内存给内核); -
used
:已使用的内存(2.1Gi,包括运行的程序、内核占用、缓存); -
free
:完全空闲的内存(1.2Gi,没被任何程序 / 缓存使用); -
shared
:多程序共享的内存(比如多个终端共享的系统库,新手不用关注); -
buff/cache
:缓存和缓冲区(4.4Gi,这是 Linux 的 “内存优化” 关键!);-
缓存(cache):存放频繁访问的文件数据(比如反复打开的文档,下次打开更快);
-
缓冲区(buffer):存放程序临时输出的数据(比如下载的文件碎片,写完后会释放);
-
-
available
:实际可用的内存(5.0Gi,= free + 可回收的 buff/cache,这是判断内存是否充足的核心指标!);
-
-
Swap(虚拟内存):
-
total
:总 swap 容量(7.9Gi); -
used
:已使用的 swap(0B,说明当前物理内存充足,没用到 swap); -
free
:空闲的 swap(7.9Gi)。
-
(2)新手避坑:别被 “used 高” 骗了!
很多新手看到used
占比高(比如 7.7Gi 内存用了 2.1Gi),就以为 “内存不够了”—— 其实要看available
:
-
如果
available
≥ 总内存的 10%(比如 8GB 内存,available≥800MB),说明内存充足; -
只有
available
< 总内存的 5%,且 swap 的used
开始增长时,才是真的 “内存紧张”。
2. vmstat:查看内存实时波动
free
只能看 “某一时刻” 的内存状态,vmstat
能看 “持续波动”,适合排查 “内存突然变满”“swap 频繁读写” 等问题。
(1)基础用法:vmstat 2 5
-
命令格式:
vmstat 刷新间隔秒数 刷新次数
-
例子:
vmstat 2 5
(每 2 秒刷新 1 次,共刷新 5 次); -
输出结果(重点看内存相关列):
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r b swpd free buff cache si so bi bo in cs us sy id wa st
 1 0 0 1258240 123456 4567896 0 0 0 0 567 1234 2 1 97 0 0
 0 0 0 1257984 123456 4567896 0 0 0 40 589 1321 1 1 98 0 0
内存相关列解读(新手重点记si
和so
):
-
swpd
:已使用的 swap 容量(和free -h
的 Swap used 一致,0 表示没用到 swap); -
free
:空闲物理内存(和free -h
的 free 一致,单位是 KB); -
buff
/cache
:缓冲区和缓存(和free -h
的 buff/cache 一致,单位是 KB); -
si
(swap in):从 swap 分区读到物理内存的数据量(单位:块 / 秒); -
so
(swap out):从物理内存写到 swap 分区的数据量(单位:块 / 秒); -
关键判断:如果
si
和so
持续大于 0(比如每次刷新都有几十 / 几百),说明物理内存不够,系统在频繁 “搬运” 数据到 swap,会导致系统变卡,需要排查内存占用高的进程。
三、实战场景:2 个核心需求的完整操作
学会命令后,要结合实际场景判断内存状态、释放资源,这才是内存管理的核心。
1. 实战 1:判断我的 Linux 内存是否充足?
以 “Ubuntu 24.04 桌面机(8GB 内存)” 和 “CentOS 9 服务器(16GB 内存)” 为例,分场景判断:
(1)桌面机场景(日常办公:浏览器 + 文档 + 音乐)
- 执行
free -h
,输出:
  total used free shared buff/cache available
Mem: 7.7Gi 3.2Gi 800Mi 512Mi 3.7Gi 4.1Gi
Swap: 7.9Gi 0B 7.9Gi
- 判断:
available
=4.1Gi(占总内存的 53%),swap 未使用,内存充足,即使再开个 IDE 也没问题。
(2)服务器场景(运行 Nginx+MySQL+Python 服务)
- 执行
free -h
,输出:
  total used free shared buff/cache available
Mem: 15Gi 10.2Gi 500Mi 256Mi 4.3Gi 3.8Gi
Swap: 15Gi 1.2Gi 13.8Gi
- 判断:
available
=3.8Gi(占总内存的 25%),swap 用了 1.2Gi,但si
/so
(用vmstat 2 3
看)持续为 0,说明只是 “部分不常用程序放到了 swap”,内存仍充足;如果si
/so
持续大于 100,才需要警惕。
新手总结:判断内存充足的 3 个标准
-
available
≥ 总内存的 10%; -
swap 的
used
增长缓慢(或不增长); -
vmstat
的si
/so
持续接近 0。
2. 实战 2:找到 “吃内存” 的进程,释放无用资源
如果发现available
过低、swap 频繁读写,就要找到 “占内存高的无用进程”,关闭后释放内存。
步骤 1:用top
找到最占内存的进程
-
启动
top
:终端输入top
; -
按
M
键(大写):按 “内存占用率(% MEM)” 从高到低排序(默认按 CPU 排序); -
查看关键列:
-
PID
:进程 ID(关闭进程需要用); -
%MEM
:进程占用的物理内存百分比; -
COMMAND
:进程对应的命令(判断进程用途);
-
-
例子:排序后看到 “chrome” 进程占 15% MEM,“python” 进程占 10% MEM,且 “python” 是之前跑的测试脚本(已无用)。
步骤 2:确认进程用途,避免误杀
-
查进程详情:用
ps -ef | grep 进程PID
,比如查 PID=1234 的 python 进程:ps -ef | grep 1234
输出:
ubuntu 1234 5678 0 10:00 pts/0 00:05:30 python ``test_script.py
确认是 “test_script.py”(无用测试脚本),可以关闭。
步骤 3:关闭无用进程,释放内存
-
优先 “正常关闭”:用
kill 进程PID
(发送终止信号,让进程保存数据后退出),比如:kill 1234
; -
若进程无响应:用
kill -9 进程PID
(强制关闭,不保存数据,慎用!),比如:kill -9 1234
; -
验证:关闭后再输
free -h
,会发现available
增加(比如从 3.8Gi 涨到 4.5Gi),top
中该进程消失。
避坑提醒:绝对不要乱杀 “系统进程”!比如
systemd
(PID=1)、
sshd
(远程连接进程)、
nginx
(服务进程),杀了会导致系统崩溃或远程断开,不确定的进程先查用途(用
man 命令名
或百度)。
四、新手必看:2 个内存管理技巧 + 1 个关键避坑
1. 技巧 1:临时清理缓存,释放可用内存
Linux 的buff/cache
会占用大量内存(比如前面例子中的 4.4Gi),当available
不足时,可以临时清理可回收的缓存(不影响运行中的程序):
-
清理页缓存(最常用):
sudo sync && sudo echo 1 > /proc/sys/vm/drop_caches
; -
清理页缓存 + 目录项缓存:
sudo sync && sudo echo 3 > /proc/sys/vm/drop_caches
; -
说明:
sync
是先把缓存中的数据写入硬盘,避免数据丢失;清理后用free -h
看,buff/cache
会减少,available
会增加。
注意:缓存是 Linux 的 “性能优化”,清理后频繁访问的文件会重新加载缓存,所以只在 “内存紧张” 时临时用,不要定期自动清理。
2. 技巧 2:调整 swappiness,减少 swap 使用(内存充足时)
swappiness
是 Linux 的 “内存交换策略” 参数(值 0-100),值越高,系统越容易把内存数据写到 swap(默认值一般是 60)。如果你的 Linux 内存充足(比如 16GB 内存,日常用不到 50%),可以降低swappiness
,减少 swap 读写,提升速度:
-
查看当前 swappiness:
cat /proc/sys/vm/swappiness
(默认输出 60); -
临时调整(重启后失效):
sudo sysctl vm.swappiness=10
(设为 10,系统优先用物理内存); -
永久调整(重启生效):
-
编辑配置文件:
sudo vim /etc/sysctl.conf
; -
末尾加一行:
vm.swappiness=10
; -
生效配置:
sudo sysctl -p
。
适合场景:桌面机、内存充足的服务器;不适合场景:内存紧张的服务器(比如 4GB 内存跑多个服务),降低后可能导致 OOM(内存溢出)。
3. 避坑:新手不要盲目禁用 swap!
很多新手觉得 “swap 速度慢,不如禁用”,这是大错特错的 —— 禁用 swap 后,当物理内存完全用尽时,Linux 会直接 “杀死占用内存最高的进程”(比如你的数据库、服务程序),导致数据丢失或服务崩溃!
-
什么时候可以考虑禁用?只有一种情况:Linux 内存极其充足(比如 64GB 内存,日常仅用 10GB),且绝对不会出现内存峰值,即便如此,也建议保留小容量 swap(比如 2GB)应急;
-
正确做法:不要禁用 swap,而是根据内存情况调整
swappiness
(内存充足时调低,内存紧张时保持默认),让 swap 成为 “应急保障” 而不是 “常态使用”。
总结:Linux 内存管理的 “核心 3 点”
-
看懂内存:用
free -h
看available
(实际可用),vmstat
看si
/so
(swap 波动),别被used
高骗了; -
释放内存:用
top
按M
找占内存高的无用进程,kill
正常关闭,kill -9
强制关闭(慎用); -
避坑关键:不盲目禁用 swap,内存充足时调低
swappiness
,内存紧张时关注available
和 swap 使用。
掌握这些内容,你就能轻松判断 Linux 内存状态,解决 “内存不够用” 的问题,避免因误操作导致系统崩溃。