Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。
因此,你发现java进程突然没了,首先要怀疑是不是被linux的OOM killer给干掉了!
你可以去下面这个文件里翻系统报错日志:/var/log/messages
执行命令 egrep -i 'killed process' /var/log/messages
去日志里进行查询。
当然,你也可以去内核日志里头查询。有时Linux系统或者系统上运行的java或者其它进程,会发生一些莫名其妙的问题,比如突然挂掉了,比如突然重启等等。在软件上找不到问题所在,此时我们应该怀疑硬件或者内核的问题,此时我们就可以使用 dmesg来查看:
dmesg | grep java
输出如下
[5673702.665338] Out of memory: Kill process 29953 (java) score 431 or sacrifice child
[5673702.665338] Killed process 29953, UID 500, (java) total-vm:9805316kB, anon-rss:2344496kB, file-rss:128kB
完全是可以看到内核对进程做对操作。
此外,OnOutOfMemoryError参数允许用户指定当出现oom时,指定某个脚本来完成一些动作。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError="sh ~/test.sh"