加swapfile是最快速有效的解法,因cc1plus编译C++时内存峰值高,多进程并行易触发OOM Killer,dmesg可查“Killed process cc1plus”实锤;需fallocate创建、chmod 600、mkswap、swapon,并调vm.swappiness=10平衡性能与稳定性。

直接加 swapfile 是最快速有效的解法,尤其在云服务器、VM 或低配开发机上。这不是权宜之计,而是 Linux 下应对 cc1plus 内存爆掉的标准操作路径。
为什么 cc1plus 会被 OOM Killer 杀掉
编译 C++ 时,cc1plus(GCC 的 C++ 前端)要解析模板、展开 STL、做语义分析、生成 AST 和 IR,单个 .cpp 文件就可能吃掉 2–4GB 内存。如果你开了 make -j8,8 个 cc1plus 进程并行,物理内存瞬间见底。系统内核发现可用内存(包括 swap)持续低于阈值,就会触发 OOM Killer,挑一个“得分高”的进程干掉——而 cc1plus 因为 RSS 大、运行时间短,往往首当其冲。
关键信号是:dmesg | grep -i "killed process" 会输出类似:
Out of memory: Kill process 12345 (cc1plus) score 897 or sacrifice child
这不是编译器 bug,也不是你代码写错了,就是物理内存 + 当前 swap 不够用。
立即学习“C++免费学习笔记(深入)”;
怎么安全创建并启用 swapfile
别碰 swap 分区,用 swapfile 更灵活、无需重启、可随时删。注意路径必须是普通文件(不能是 LVM 或 btrfs 子卷),且权限必须是 600。
-
sudo fallocate -l 8G /swapfile(推荐;比dd快,不写零) -
sudo chmod 600 /swapfile(必须!否则swapon拒绝启用) sudo mkswap /swapfilesudo swapon /swapfile- 验证:
free -h看Swap行是否已生效
如果 fallocate 报 “Operation not supported”,说明文件系统不支持(如某些 NFS 或 old ext3),改用:
sudo dd if=/dev/zero of=/swapfile bs=1G count=8 && sudo chmod 600 /swapfile
swappiness 要调低,但不是关掉
默认 vm.swappiness=60 会让内核过早把匿名页换出,反而拖慢编译。但设成 0 又会导致 OOM Killer 更激进——因为内核宁愿杀进程也不愿换出。
折中方案是设为 10:
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.confsudo sysctl -p
这个值的意思是:只有当可用内存降到约 10% 以下时,内核才开始积极换出;既给 cc1plus 留足缓冲空间,又避免日常使用变卡。
临时方案之外,编译时还能立刻降内存压力
swapfile 解决的是“能不能过”,下面这些能帮你“少用点内存”,加快编译速度:
- 把
make -j8改成make -j$(nproc --ignore=2)(留 2 核给系统,减少并发数) - 禁用链接时优化:
-flto=auto很吃内存,编译阶段先去掉,等最后链接再开 - 用
-O1替代-O2或-O3编译中间对象(调试/CI 阶段足够) - 确认没误开
-g3(带宏定义的调试信息比-g多几倍内存占用)
真正容易被忽略的是:swapfile 创建后,一定要检查 /proc/meminfo 里的 SwapTotal 和 SwapFree 是否匹配预期大小。有些环境(如 Docker 容器或某些云平台)默认禁用 swap,swapon 成功但实际不生效——这时 free -h 显示有 Swap,而 cat /proc/meminfo | grep Swap 却显示 0。


















