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-----

&#x20;r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

&#x20;1  0      0 1258240 123456 4567896    0    0     0     0  567 1234  2  1 97  0  0

&#x20;0  0      0 1257984 123456 4567896    0    0     0    40  589 1321  1  1 98  0  0

内存相关列解读(新手重点记siso):

  • 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 分区的数据量(单位:块 / 秒);

  • 关键判断:如果siso持续大于 0(比如每次刷新都有几十 / 几百),说明物理内存不够,系统在频繁 “搬运” 数据到 swap,会导致系统变卡,需要排查内存占用高的进程。

三、实战场景:2 个核心需求的完整操作

学会命令后,要结合实际场景判断内存状态、释放资源,这才是内存管理的核心。

1. 实战 1:判断我的 Linux 内存是否充足?

以 “Ubuntu 24.04 桌面机(8GB 内存)” 和 “CentOS 9 服务器(16GB 内存)” 为例,分场景判断:

(1)桌面机场景(日常办公:浏览器 + 文档 + 音乐)

  • 执行free -h,输出:
&#x20;             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,输出:
&#x20;             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 个标准

  1. available ≥ 总内存的 10%;

  2. swap 的used增长缓慢(或不增长);

  3. vmstatsi/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,系统优先用物理内存);

  • 永久调整(重启生效):

  1. 编辑配置文件:sudo vim /etc/sysctl.conf

  2. 末尾加一行:vm.swappiness=10

  3. 生效配置:sudo sysctl -p

适合场景:桌面机、内存充足的服务器;不适合场景:内存紧张的服务器(比如 4GB 内存跑多个服务),降低后可能导致 OOM(内存溢出)。

3. 避坑:新手不要盲目禁用 swap!

很多新手觉得 “swap 速度慢,不如禁用”,这是大错特错的 —— 禁用 swap 后,当物理内存完全用尽时,Linux 会直接 “杀死占用内存最高的进程”(比如你的数据库、服务程序),导致数据丢失或服务崩溃!

  • 什么时候可以考虑禁用?只有一种情况:Linux 内存极其充足(比如 64GB 内存,日常仅用 10GB),且绝对不会出现内存峰值,即便如此,也建议保留小容量 swap(比如 2GB)应急;

  • 正确做法:不要禁用 swap,而是根据内存情况调整swappiness(内存充足时调低,内存紧张时保持默认),让 swap 成为 “应急保障” 而不是 “常态使用”。

总结:Linux 内存管理的 “核心 3 点”

  1. 看懂内存:用free -havailable(实际可用),vmstatsi/so(swap 波动),别被used高骗了;

  2. 释放内存:用topM找占内存高的无用进程,kill正常关闭,kill -9强制关闭(慎用);

  3. 避坑关键:不盲目禁用 swap,内存充足时调低swappiness,内存紧张时关注available和 swap 使用。

掌握这些内容,你就能轻松判断 Linux 内存状态,解决 “内存不够用” 的问题,避免因误操作导致系统崩溃。

posted @ 2025-10-12 18:56  S&L·chuck  阅读(24)  评论(0)    收藏  举报