在一台虚拟机上执行docker java应用,每隔一段时间就会出现java进程消失、而且没有任何jvm error log的情况。
略一寻思,应该是遇到网上常说的Linux OOM的情况:虚拟机10G,docker默认分配内存未做限制。
原因定位
去服务器上执行:dmesg | grep java
,果然有数据
并且查看文件: /var/log/messages
定位关键字:oom-killer,
看到相关信息:java pid信息,
memory: usage 2047696kB, limit 2047696kB, failcnt 23543
memory+swap: usage 2047696kB, limit 9007199254740991kB, failcnt 0
......
Free swap = 0kB
Total swap = 0kB
......
Memory cgroup out of memory: Kill process 18286 (java) score 933 or sacrifice child
最终java进程被Linux OOM弄死了:因为oom的score太高了:933。启动的时候score是225,进程的oom_score 分数越高,越容易被 OOM Killer 杀掉。使用如下脚本检测oom score:
# vi oomscore.sh