Linux下扩充Swap交换空间:解决内存不足的实用指南,这些影响要注意! 电子说
大家在使用 Linux 系统(比如常用的 Ubuntu)时,是不是偶尔会遇到 “内存不足” 的弹窗?比如运行大型编译任务、多开虚拟机、做数据分析,或者把 Linux 当服务器用的时候,物理内存一旦 “告急”,系统就会卡顿甚至崩溃。这时候,Swap 交换空间就成了“救场神器”。
今天就带大家全面搞懂 Swap:它是什么、什么时候需要扩充、扩充后对堆内存和存储速率有啥影响,最后附上一步到位的 Ubuntu 扩充教程,新手也能跟着做!

简单说,Swap 就像 Linux 的 “虚拟内存”,和 Windows 的虚拟内存原理类似 —— 当物理内存(就是你电脑里插的内存条)不够用的时候,系统会把内存中暂时用不上的数据,临时存到硬盘(或 SSD)的 Swap 分区 / 文件里,腾出物理内存给急需的程序使用。
比如 Ubuntu 系统默认的 Swap 大小通常是 2G,如果你物理内存是 8G,运行一个占 10G 内存的程序,这时候 Swap 就会 “接手” 剩下的 2G,避免程序直接崩溃。
不是所有情况都需要扩充 Swap,关键看你的使用场景和系统状态。以下 3 种情况,建议立刻检查并扩充 Swap:
•比如物理内存 8G,却要运行占 12G 内存的大型软件(如 Matlab、Docker 容器集群、视频渲染工具);
•多任务并发时(比如开着代码编辑器、浏览器、虚拟机、数据库),系统卡顿明显,用free -h命令查看时,“可用内存” 接近 0,Swap 却已经占满。
如果把 Linux 当服务器(比如 Web 服务器、数据库服务器),长期有大量进程在后台运行,即使物理内存暂时够用,也建议扩充 Swap—— 避免突发流量(比如瞬间大量用户访问)导致内存峰值超负载,从而保证服务稳定。
比如树莓派、嵌入式 Linux 设备(物理内存可能只有 2G/4G),运行轻量级服务器或边缘计算任务时,2G 默认 Swap 不够用,扩充后能显著减少 “内存溢出” 风险。
首先得明确:堆内存是程序运行时动态申请的内存空间(比如 Java 的 JVM 堆、C++ 的new申请的内存),是程序“干活” 的核心内存区域。Swap 和堆内存的关系很紧密,扩充后影响主要有两点:
当程序申请的堆内存超过物理内存上限时,系统会把堆内存中“暂时闲置” 的数据(比如很久没调用的变量、缓存数据)转移到 Swap 中,释放物理内存给新的堆内存申请。
举个例子:你运行一个 Java 程序,JVM 堆设置为 10G,而物理内存只有 8G。如果没有 Swap,程序会直接报 “OOM(内存溢出)” 错误;有了 8G Swap 后,系统会把堆中暂时不用的 2G 数据存到 Swap,程序能正常运行。
如果堆内存数据需要频繁在“物理内存” 和 “Swap” 之间切换(行业里叫 “内存颠簸”),程序响应会明显变慢。因为硬盘 / SSD 的读写速度,比物理内存慢了几个数量级(物理内存是 GB/s 级,机械硬盘是 MB/s 级,即使是 SSD 也差 10 倍以上)。
比如你写的程序频繁申请和释放堆内存,且数据量接近物理内存上限,Swap 会反复 “存 / 取” 堆数据,此时你会发现程序卡顿、CPU 占用率飙升(因为 CPU 要等数据交换完成)。
Swap 本质是 “用硬盘空间当内存”,所以它的读写速度完全依赖你的存储设备,同时也会占用存储设备的 IO 资源,影响其他操作:
|
存储类型
|
Swap 读写速度
|
对系统的影响
|
|
机械硬盘(HDD)
|
慢(约 50-150MB/s)
|
严重占用硬盘 IO,同时做文件拷贝、安装软件会卡顿,甚至系统整体响应变慢
|
|
固态硬盘(SSD)
|
较快(约 500-2000MB/s)
|
影响比 HDD 小,但频繁读写 Swap 会消耗 SSD 的 “擦写寿命”(SSD 有固定擦写次数)
|
|
nvme 固态硬盘
|
很快(约 3000-7000MB/s)
|
影响最小,接近物理内存速度,适合作为 Swap 存储介质
|
如果 Swap 使用率超过 50%,且持续上升,说明物理内存已经严重不足,系统大部分时间都在 “搬数据”(把物理内存数据写到 Swap,再把 Swap 数据读回物理内存),此时:
•打开文件、切换软件要等很久;
•命令行输入指令,回车后要延迟几秒才响应;
•甚至鼠标光标都会“卡顿跳帧”。
以 Ubuntu 系统为例,从 “查看当前 Swap” 到 “开机自动生效”,每一步都有具体命令和示例,新手也能跟着做(其他 Linux 发行版步骤类似,命令通用)。
•确保系统有足够的硬盘 / SSD 空间(比如要扩到 8G,就需要至少 8G 空闲空间);
•用sudo权限操作(需要管理员密码)。
先执行free -h命令,查看当前 Swap 的总大小和使用情况(-h表示“人类可读格式”,用 GB/MB 显示,更直观):
free -h
执行后会看到类似输出:
总计 已用 空闲 共享 缓冲/缓存 可用内存: 19Gi 1.2Gi 5.9Gi 3.0Mi 12Gi 17Gi交换: 2.0Gi 0B 2.0Gi
能看到默认 Swap 是 2G,这时候如果要扩到 8G,继续下一步。
扩充前必须关闭当前的 Swap(避免数据冲突),执行命令:
sudo swapoff -a
输入管理员密码后,再用free -h验证,会发现“交换” 那一行的 “总计” 变成 0,说明关闭成功:
交换: 0B 0B 0B
用dd命令创建一个指定大小的 Swap 文件(这里以扩到 8G 为例),命令如下:
sudo dd if=/dev/zero of=/swapfile bs=1G count=8
•解释一下参数:
◦if=/dev/zero:从“零设备” 读取数据(用来生成空白文件);
◦of=/swapfile:把生成的文件保存到根目录,命名为swapfile;
◦bs=1G:每次读写的“块大小” 是 1G;
◦count=8:读取 8 次块,总大小 = 1G×8=8G(想扩到 16G 就把 count 改成 16)。
执行后会看到类似输出,说明文件创建成功:
记录了8+0的读入记录了8+0的写出8589934592字节(8.6GB,8.0GiB)已复制,7.04727秒,1.2GB/s
为了安全,必须把 Swap 文件的权限设为600—— 只有 root 用户能读写,其他用户没有权限(防止误修改或篡改),命令:
sudo chmod 600 /swapfile
执行后没有输出,说明权限设置成功。
把刚才创建的空白文件格式化为“Swap 格式”,让系统能识别为交换空间,命令:
sudo mkswap /swapfile
执行后会看到类似输出,包含 Swap 的 UUID(不用管 UUID,知道成功就行):
正在设置交换空间版本1,大小=8GiB(8589930496 个字节)无标签,UUID=C27ae28e-a3ea-47fa-ad81-7f4bc779fa8e
格式化后,启用这个新的 Swap 文件,命令:
sudo swapon /swapfile
再用free -h验证,会发现“交换” 的总计变成 8G,说明启用成功:
交换: 8.0Gi 0B 8.0Gi
默认情况下,重启系统后新的 Swap 会失效,所以要把 Swap 文件添加到/etc/fstab配置文件中,让系统开机自动加载。
1.用文本编辑器打开/etc/fstab:
sudo nano /etc/fstab
1.在文件末尾添加一行(复制粘贴即可,注意不要写错):
/swapfile none swap sw 0 0
1.保存退出:按Ctrl+O(字母 O),再按回车确认,最后按Ctrl+X退出编辑器。
这样重启系统后,Swap 还是 8G,不会失效。
1.Swap 大小不是越大越好:
一般建议 Swap 大小是物理内存的 1-2 倍(比如物理内存 16G,Swap 设 16-32G);但如果是 SSD,不建议超过物理内存(避免频繁读写消耗 SSD 寿命)。
2.Swap 文件别放错位置:
尽量把 Swap 文件放在空闲空间充足的分区,优先选 SSD(速度快),别放在机械硬盘的系统分区(会拖慢系统)。
3.关闭 Swap 要谨慎:
如果系统正在高负载运行(比如有程序在用 Swap),突然执行swapoff -a会导致程序崩溃,建议在“系统空闲时” 操作。
4.定期检查 Swap 使用情况:
用htop或free -h定期查看 Swap 使用率,如果长期超过 50%,说明物理内存真的不够用,建议升级内存条(Swap 只是 “应急”,不能替代物理内存)。
Swap 是 Linux 系统的 “内存缓冲垫”,合理扩充能解决很多内存不足的问题,但也要注意它对堆内存和存储速率的影响 —— 不要过度依赖 Swap,升级物理内存才是根本解决方案。
如果觉得这篇教程有用,欢迎分享给身边用 Linux 的朋友~
全部0条评论
快来发表一下你的评论吧 !