哪些原因可能會導致JAVA進程被kill呢?
- Java應用程序的問題:發(fā)生OOM導致進程Crash
- JVM自身故障:JVM或JDK自身的Bug導致進程Crash
- 被操作系統(tǒng)OOM-Killer
該如何去排查問題呢钩蚊?
- Java應用程序的問題:發(fā)生OOM導致進程Crash
這種情況主要取決于研發(fā)代碼質(zhì)量锻霎,我遇到過的大概有2次庙睡。一般情況下事富,出現(xiàn)OOM異常,JVM的GC會進行回收埃撵,是不會直接導致JVM進程退出的赵颅。如果出現(xiàn)退出的情況,那就是內(nèi)存泄漏暂刘,由于內(nèi)存占用越來越大饺谬,結(jié)果。谣拣。募寨。。不過這種JVM的OOM導致的異常森缠,很好排查拔鹰。排查步驟如下:
Step1: 查看JVM參數(shù) -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath=*/java.hprof
Step2: 根據(jù)HeapDumpPath指定的路徑查看是否產(chǎn)生dump文件;
Step3: 若存在dump文件贵涵,使用VisualVM這種可視化工具分析就行等工具分析即可列肢;
JVM自身故障:JVM或JDK自身的Bug導致進程Crash
這種情況遇到一次,是因為JDK自身BUG導致的宾茂。當JVM出現(xiàn)致命錯誤時瓷马,會生成一個hs_err_pid_xxx.log這樣的文件,該文件包含了導致jvm crash的重要信息跨晴,可以通過分析該文件定位到導致crash的根源欧聘,從而改善以保證系統(tǒng)穩(wěn)定。當出現(xiàn)crash時端盆,該文件默認會生成到工作目錄下怀骤,然而可以通過jvm參數(shù)-XX:ErrorFile指定生成路徑,eg:
-XX:ErrorFile=/var/log/hs_err_pid<pid>.log
然后根據(jù)錯誤信息焕妙,可以進入Java BUG dataBase庫中去查找對應的BUG:
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8134389被操作系統(tǒng)OOM-Killer
這種情況也遇到過一次蒋伦。Linux 內(nèi)核有個機制叫OOM killer(Out-Of-Memory killer),該機制會監(jiān)控那些占用內(nèi)存過大访敌,尤其是瞬間很快消耗大量內(nèi)存的進程凉敲,為了防止內(nèi)存耗盡而內(nèi)核會把該進程殺掉∷峦可以去/var/log/messages里翻系統(tǒng)報錯日志爷抓,執(zhí)行如下命令:
[root@vmt124-m5 /]# egrep -i 'killed process' /var/log/messages
Dec 29 00:39:41 localhost kernel: Killed process 26790, UID 0, (java) total-vm:9263796kB, anon-rss:4578020kB, file-rss:20kB
當然,你也可以去內(nèi)核日志里頭查詢阻塑。有時Linux系統(tǒng)或者系統(tǒng)上運行的java或者其它進程蓝撇,會發(fā)生一些莫名其妙的問題,比如突然掛掉了陈莽,比如突然重啟等等渤昌。在軟件上找不到問題所在,此時我們應該懷疑硬件或者內(nèi)核的問題走搁,此時我們就可以執(zhí)行 dmesg | grep java
命令來查看:
[root@vmt124-m5 /]# dmesg | grep java
java invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
java cpuset=/ mems_allowed=0
Pid: 25475, comm: java Not tainted 2.6.32-220.el6.x86_64 #1
[31952] 0 31952 2338119 469643 2 0 0 java
[ 2435] 5025 2435 830476 11657 0 0 0 java
[26790] 0 26790 2315949 1144510 1 0 0 java
Out of memory: Kill process 26790 (java) score 560 or sacrifice child
Killed process 26790, UID 0, (java) total-vm:9263796kB, anon-rss:4578020kB, file-rss:20kB
完全是可以看到內(nèi)核對進程做對操作独柑。
總結(jié)
對以上異常出現(xiàn)排查的排查順序一般是:Java應用程序的問題 -> JVM自身故障 -> 被操作系統(tǒng)OOM-Killer。