背景
在編譯 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的問題。