1. 程式人生 > 實用技巧 >定位JAVA程序被kill的原因

定位JAVA程序被kill的原因

哪些原因可能會導致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
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。