在Ubuntu上用Golang编译时撞上OOM,确实挺让人头疼的。好在社区里已经积累了不少行之有效的解决办法,下面逐一拆解。

-
给系统加点“后援”——增加交换空间
交换空间(Swap)本质上是磁盘里划出的一块区域,物理内存不够时操作系统会把暂时不用的数据挪过去。操作很简单,先创建一个交换文件,比如分配2GB:
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile大小可以根据实际需要调整。想让交换空间重启后依然生效,把下面这行加到
/etc/fstab里:/swapfile none swap sw 0 0 -
给编译过程“节流”——限制内存使用
Golang编译器本身可以通过
GODEBUG环境变量来调节内存消耗。比如下面这行命令会把内存使用控制在1GB左右:GODEBUG=gctrace=1,GOMAXPROCS=1,GODEBUG=madvdontneed=1 GODEBUG=madvnotneeded=1 go build -o myapp注意,这样一搞编译速度可能会变慢——毕竟是拿时间换空间了。
-
清场——关掉不用的服务和程序
编译前用
systemctl把那些占内存的后台服务停掉,或者直接用kill干掉不必要的进程。释放出来的几GB往往就能让编译顺利跑完。 -
检查“家底”——系统资源限制
很多Linux发行版默认会对单进程的内存使用有所限制。先拿
ulimit -v看一眼当前的虚拟内存上限:ulimit -v如果数值太小,临时调高它,比如设成4GB:
ulimit -v 4194304不过这招只对当前终端会话有效。想永久生效就得编辑
/etc/security/limits.conf文件了。 -
终极方案——升级硬件
如果上面几步都试过了还是扛不住,那就得认真考虑给机器加点物理内存,或者换块读写更快的固态硬盘。硬件上去了,编译速度和内存压力自然一并解决。