背景
在编译 Android 10 代码的时候,OpenJDK发现报错:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(.., .., 0) failed; error='Not enough space' (errno=12)
原因:运行或编译占用内存巨大的大软件大项目的过程中可能会出现 errno12(申请内存不足)
先执行命令
free -m
查看内存是不是还有 最主要的是 看有没有交换空间 swap (这很重要)如果没有交换空间 或者交换空间比较小 要先安装交换空间 或者增大空间
下面介绍在Ubuntu 18.04上通过扩大swapfile来增加swap空间以解决这个编译问题
备注:下列操作都需要超级用户权限
参考:
- https://blog.csdn.net/weixin_44105991/article/details/91320644
- https://blog.csdn.net/qq_31851107/article/details/109469331
解决
执行命令并观察swap空间是否存在和大小:
# free -h
total used free shared buff/cache available
Mem: 62G 11G 49G 5.3M 800M 49G
Swap: 2.0G 790M 1.2G
# swapon -s
Filename Type Size Used Priority
/swapfile file 2097148 806584 -2
删除swapfile(如果之前有)
如果已经存在swapfile(例如:/swapfile),执行下面的命令删除
swapoff /swapfile #unmount swap文件
rm -rf /swapfile
再执行free和swapon -s ,检查是否依然存在swap空间
创建更大的swapfile
创建一个16G的 /swapfile
:
dd if=/dev/zero of=/swapfile bs=1M count=16384
其中,16384=16×1024×1M,即创建了一个16G的swapfile。
-
if=指定输入文件名,/dev/zero 代表 空
-
of=指定输出文件名
-
bs=bytes:同时设置读入/输出的块大小为bytes个字节
-
count=blocks:此为块大小,等于以bs为单位指定的空间。
修改权限
chmode 0600 /swapfile
格式化
mkswap /swapfile
到这里,swapfile创建完毕
配置swap文件(如果之前没有)
一般系统都会有挂载swapfile,但是如果没有的话,就需要配置在系统启动时挂载swap空间:
vim /etc/fstab
在最末增加新的一行:
/swapfile none swap sw 0 0
启动swap空间
swapon /swapfile
可以执行 free -h ; swapon -s
,看看swap空间大小
free -h
total used free shared buff/cache available
Mem: 62G 13G 28G 14M 20G 48G
Swap: 15G 0B 15G
swapon -s
Filename Type Size Used Priority
/swapfile file 16777212 0 -2
测试
重新编译自己的项目,看看是否解决了OpenJDK的errno=12的问题。