哪些原因可能會導致JAVA進程被kill呢?
- Java應用程序的問題:發生OOM導致進程Crash
- JVM自身故障:JVM或JDK自身的Bug導致進程Crash
- 被操作系統OOM-Killer
該如何去排查問題呢?
- Java應用程序的問題:發生OOM導致進程Crash
這種情況主要取決於研發代碼質量,我遇到過的大概有2次。一般情況下,出現OOM異常,JVM的GC會進行回收,是不會直接導致JVM進程退出的。如果出現退出的情況,那就是內存泄漏,由於內存占用越來越大,結果。。。。不過這種JVM的OOM導致的異常,很好排查。排查步驟如下:
Step1: 查看JVM參數 -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath=*/java.hprof Step2: 根據HeapDumpPath指定的路徑查看是否產生dump文件; Step3: 若存在dump文件,使用VisualVM這種可視化工具分析就行等工具分析即可;
-
JVM自身故障:JVM或JDK自身的Bug導致進程Crash
這種情況遇到一次,是因為JDK自身BUG導致的。當JVM出現致命錯誤時,會生成一個hs_err_pid_xxx.log這樣的文件,該文件包含了導致jvm crash的重要信息,可以通過分析該文件定位到導致crash的根源,從而改善以保證系統穩定。當出現crash時,該文件默認會生成到工作目錄下,然而可以通過jvm參數-XX:ErrorFile指定生成路徑,eg:
-XX:ErrorFile=/var/log/hs_err_pid<pid>.log
然后根據錯誤信息,可以進入Java BUG dataBase庫中去查找對應的BUG:
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8134389 -
被操作系統OOM-Killer
這種情況也遇到過一次。Linux 內核有個機制叫OOM killer(Out-Of-Memory killer),該機制會監控那些占用內存過大,尤其是瞬間很快消耗大量內存的進程,為了防止內存耗盡而內核會把該進程殺掉。可以去/var/log/messages里翻系統報錯日志,執行如下命令:
[root
當然,你也可以去內核日志里頭查詢。有時Linux系統或者系統上運行的java或者其它進程,會發生一些莫名其妙的問題,比如突然掛掉了,比如突然重啟等等。在軟件上找不到問題所在,此時我們應該懷疑硬件或者內核的問題,此時我們就可以執行 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
完全是可以看到內核對進程做對操作。
總結
對以上異常出現排查的排查順序一般是:Java應用程序的問題 -> JVM自身故障 -> 被操作系統OOM-Killer。
作者:Root_123
鏈接:https://www.jianshu.com/p/0d2e4f393ded
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。