Linux Swap交换空间详解:Android编译内存不足?这样扩充立竿见影

电子说

1.4w人已加入

描述

 

 

 Linux 系统使用过程中,你是否遇到过 内存不足” 的报错?比如编译 Android 源码时,明明按教程操作,却因物理内存没达到 16G 要求而编译中断?这正是 Swap 交换空间不足在 搞鬼。今天不仅要带大家搞懂 Swap 的核心作用,还会结合 Android 源码编译的实战场景,给出针对性的扩充方案,新手也能轻松上手~

 

 

一、什么是 Swap?为什么非它不可?

 

1. 通俗理解:内存的 备用抽屉

 

如果把物理内存(RAM)比作电脑的 桌面”—— 常用文件随手可及;那 Swap 交换空间就是 抽屉:当桌面堆满文件(物理内存占满),系统会把暂时不用的文件(不活跃进程数据)放进抽屉,腾出桌面给急需的任务。

 

 

2. 三大核心作用,缺一不可

 

应急救急:物理内存耗尽时,Swap 临时承接数据,避免程序直接 OOM(内存溢出)崩溃,比如 Android 源码编译这类高内存需求场景;

 

 

支持休眠:系统休眠时,会把全部内存数据写入 Swap,唤醒时再读回内存,没有 Swap 就无法使用休眠功能;

 

 

优化性能:长期运行的服务器中,Swap 会缓存不常用进程,让物理内存集中供给活跃程序,提升整体响应速度。

 

 

3. 实战场景:Android 源码编译的 内存门槛

 

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 的两种实用方法(附 Android 编译场景适配)

 

在操作前,先搞清楚当前 Swap 状态 —— 这是后续操作的基础。

 

 

2.1 前提:检查当前 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会报错

2.2 方法一:文件方式(推荐!Android 编译首选)

 

适合没有空闲磁盘分区的场景,直接创建文件作为 Swap,灵活调整大小,完美适配 Android 编译的临时高内存需求。

 

 

步骤 1:创建适配 Android 编译的 Swap 文件(关键!)

 

假设你的物理内存是 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 Swap6+10=16G),核心是让 物理内存 + Swap”≥16G

 

 

步骤 2:设置安全权限(避免敏感数据泄露)

 

Swap 文件包含系统和编译过程中的敏感数据,必须设置为仅 root 可读可写:

 

 

  •  
sudo chmod 600 /swapfile
步骤 3:格式化 Swap 文件(系统识别必备)

 

将创建的文件格式化为 Swap 格式,让 Linux 系统能正常使用:

 

 

  •  
sudo mkswap /swapfile

输出提示Setting up swapspace version 1, size = 8 GiB 表示成功。

 

 

步骤 4:启用新 Swap 文件(立即生效,无需重启)

 

  •  
sudo swapon /swapfile
步骤 5:设置开机自动挂载(编译过程不中断)

 

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

 

 

步骤 6:验证是否满足 Android 编译要求

 

再次执行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 报错。

 

 

2.3 方法二:分区方式(适合有空闲磁盘分区,性能更优)

 

如果你的硬盘有未分配的空闲分区(比如/dev/sda3,大小≥8G),可直接将分区设为 Swap,读写速度比文件方式快,适合频繁编译 Android 源码的场景。

 

 

简要步骤:

 

1.查看空闲分区:sudo fdisk -l(找到标注free的分区,确保大小≥8G,如/dev/sda3);

 

 

2.格式化分区为 Swapsudo mkswap /dev/sda3

 

 

3.启用分区:sudo swapon /dev/sda3

 

 

4.永久生效:编辑/etc/fstab,添加/dev/sda3 swap swap defaults 0 0

 

 

5.验证:free -h 确认 Swap 大小≥8G,总内存达标。

 

 

三、Android 编译场景专属注意事项(避坑必看)

 

1.Swap 大小精准匹配

 

 

核心原则:物理内存(RAM+ Swap ≥16GAndroid 源码编译最低要求);

 

 

示例:8G RAM→8G Swap12G RAM→4G Swap16G 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 报错,让编译过程一路畅通~ 如果你在操作中遇到问题,欢迎在评论区留言交流!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分