场景:我这边从Hbase跑一亿多的全量数据录入Elasticsearch中,跑了四个多小时,程序突然挂掉了,然后我就纳闷了,为啥突然挂掉了???
思路1:是不是Java 进程抛出OOM异常?
分析程序日志没有任何异常,如果出现这种异常应该会在日志中打印的啊,怎么没有呢?
如果是java OOM异常会打印 Java heap space的
Exception in thread "pool-13-thread-25" java.lang.OutOfMemoryError: Java heap space
Exception in thread "pool-13-thread-48" java.lang.OutOfMemoryError: Java heap space
后来我在JVM参数中添加了-XX:+UnlockExperimentalVMOptions
和-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log
看看垃圾回收情况以及如果出现OOM后生成java_pid30796.hprof
文件然后利用Jprofile进行分析OOM异常根源,但是发现并没有出现OOM异常,也没有dump文件,因而可以确定并不是java OOM异常。
思路2:是不是linux保护机制强制杀死的进程?
其实一开始没有看到程序OOM异常日志,就应该想到是linux保护机制强行杀死的,搞的在上面饶了一大圈,浪费太多时间
然后百度,查看最近被linux kill掉的进程信息
执行命令:dmesg | egrep -i -B100 'killed process'
输出:
[20987454.255158] Out of memory: Kill process 24953 (java) score 805 or sacrifice child
[20987454.255239] Killed process 24953 (java) total-vm:10973432kB, anon-rss:7284104kB, file-rss:0kB, shmem-rss:0kB
原因是Low memory耗尽。“内核使用low memory来跟踪所有的内存分配,一旦low memory耗尽,就会查杀进程,以保持系统的正常运转。说白了 OOM Killer 就是一层保护机制,用于避免 Linux 在内存不足的时候不至于出太严重的问题,把无关紧要的进程杀掉