Linux Swap交换空间详解:Android编译内存不足?这样扩充立竿见影 电子说
在 Linux 系统使用过程中,你是否遇到过 “内存不足” 的报错?比如编译 Android 源码时,明明按教程操作,却因物理内存没达到 16G 要求而编译中断?这正是 Swap 交换空间不足在 “搞鬼”。今天不仅要带大家搞懂 Swap 的核心作用,还会结合 Android 源码编译的实战场景,给出针对性的扩充方案,新手也能轻松上手~
如果把物理内存(RAM)比作电脑的 “桌面”—— 常用文件随手可及;那 Swap 交换空间就是 “抽屉”:当桌面堆满文件(物理内存占满),系统会把暂时不用的文件(不活跃进程数据)放进抽屉,腾出桌面给急需的任务。
•应急救急:物理内存耗尽时,Swap 临时承接数据,避免程序直接 OOM(内存溢出)崩溃,比如 Android 源码编译这类高内存需求场景;
•支持休眠:系统休眠时,会把全部内存数据写入 Swap,唤醒时再读回内存,没有 Swap 就无法使用休眠功能;
•优化性能:长期运行的服务器中,Swap 会缓存不常用进程,让物理内存集中供给活跃程序,提升整体响应速度。
Android 源码编译是典型的高内存消耗场景 —— 官方推荐物理内存≥16G,若你的 Linux 主机只有 8G/12G 物理内存,编译过程中会频繁出现以下报错:
Out of memory: Killed process 12345 (cc1plus) total-vm:1234567kB, anon-rss:876543kB, file-rss:0kB, shmem-rss:0kB
或直接提示“内存不足,编译中断”。这时候无需更换硬件,通过扩充 Swap 将 “物理内存 + Swap” 的总可用内存提升到 16G 以上,就能顺利完成编译。
在操作前,先搞清楚当前 Swap 状态 —— 这是后续操作的基础。
打开终端,执行以下命令,查看 Swap 的大小、是否启用:
# 方法1:简洁查看(h=人性化单位)free -h# 方法2:详细查看Swap设备/文件swapon --show# 方法3:查看Swap使用情况cat /proc/swaps
输出示例(8G 物理内存,无 Swap 时):
total used free shared buff/cache availableMem: 7.7Gi 1.2Gi 5.3Gi 245Mi 1.2Gi 6.1GiSwap: 0B 0B 0B # 无Swap空间,编译Android会报错
适合没有空闲磁盘分区的场景,直接创建文件作为 Swap,灵活调整大小,完美适配 Android 编译的临时高内存需求。
假设你的物理内存是 8G,需要创建 8G Swap 文件(总可用内存达 16G,满足编译要求),用fallocate命令快速创建:
# 创建8G的Swap文件(路径/swapfile可自定义,大小根据物理内存调整)sudo fallocate -l 8G /swapfile
如果系统提示fallocate: 未找到命令,改用dd命令(速度稍慢,但兼容性强):
# bs=1G 每次写入1G,count=8 共写入8次,总计8G(Android编译推荐大小)sudo dd if=/dev/zero of=/swapfile bs=1G count=8
注意:若物理内存是 12G,创建 4G Swap 即可(12+4=16G);物理内存 6G 则创建 10G Swap(6+10=16G),核心是让 “物理内存 + Swap”≥16G。
Swap 文件包含系统和编译过程中的敏感数据,必须设置为仅 root 可读可写:
sudo chmod 600 /swapfile
将创建的文件格式化为 Swap 格式,让 Linux 系统能正常使用:
sudo mkswap /swapfile
输出提示Setting up swapspace version 1, size = 8 GiB 表示成功。
sudo swapon /swapfile
Android 源码编译耗时久(可能数小时),若中途重启,Swap 会失效导致编译中断,需编辑/etc/fstab文件实现永久生效:
1.先备份fstab(防止改错导致系统无法启动):
sudo cp /etc/fstab /etc/fstab.bak
1.编辑文件:
sudo nano /etc/fstab
1.在文件末尾添加一行(复制粘贴即可):
/swapfile swap swap defaults 0 0
1.保存退出(nano 编辑器按Ctrl+O→回车→Ctrl+X)。
再次执行free -h,看到“Mem+Swap”≥16G 即达标:
total used free shared buff/cache availableMem: 7.7Gi 1.3Gi 5.2Gi 250Mi 1.2Gi 6.0GiSwap: 8.0Gi 0B 8.0Gi # 总可用内存达13.7Gi?不对!
补充说明:available 是系统可分配给新进程的内存(含空闲内存 + 可释放缓存),实际编译时,系统会动态使用物理内存和 Swap,只要 “Swap + 物理内存总量”≥16G,就能避免 OOM 报错。
如果你的硬盘有未分配的空闲分区(比如/dev/sda3,大小≥8G),可直接将分区设为 Swap,读写速度比文件方式快,适合频繁编译 Android 源码的场景。
1.查看空闲分区:sudo fdisk -l(找到标注free的分区,确保大小≥8G,如/dev/sda3);
2.格式化分区为 Swap:sudo mkswap /dev/sda3;
3.启用分区:sudo swapon /dev/sda3;
4.永久生效:编辑/etc/fstab,添加/dev/sda3 swap swap defaults 0 0;
5.验证:free -h 确认 Swap 大小≥8G,总内存达标。
1.Swap 大小精准匹配:
◦核心原则:物理内存(RAM)+ Swap ≥16G(Android 源码编译最低要求);
◦示例:8G RAM→8G Swap,12G RAM→4G Swap,16G RAM→无需扩充(若编译时仍卡顿,可加 4-8G Swap)。
1.存储介质优先选 SSD:
Android 编译过程中会频繁读写 Swap,机械硬盘(HDD)速度慢,会导致编译卡顿;SSD 的读写速度是 HDD 的数倍,能大幅提升 Swap 响应速度,避免编译耗时翻倍。
2.编译时关闭其他高内存进程:
扩充 Swap 后,尽量关闭浏览器、虚拟机等占用内存的程序,让系统把物理内存和 Swap 集中供给编译进程,进一步减少卡顿和报错概率。
3.如何删除无用 Swap?
若后续不再编译 Android 源码,可删除 Swap 释放磁盘空间:
# 临时关闭Swapsudo swapoff /swapfile(或/dev/sda3)# 永久删除:删除/etc/fstab中的对应行,再删除文件/分区sudo rm /swapfile
Swap 交换空间是 Linux 系统的 “内存救星”,尤其对于 Android 源码编译这类高内存需求场景,无需升级硬件,通过文件或分区方式扩充 Swap,就能轻松突破内存限制。关键要记住:根据物理内存精准设置 Swap 大小(总内存≥16G),优先用 SSD 存储,设置开机自动挂载避免编译中断。
按照本文步骤操作后,再执行 Android 源码编译命令,就能顺利避开 OOM 报错,让编译过程一路畅通~ 如果你在操作中遇到问题,欢迎在评论区留言交流!
全部0条评论
快来发表一下你的评论吧 !