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.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@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
當然,你也可以去內核日志里頭查詢。有時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。
總結
以上是生活随笔為你收集整理的java进程被kill_定位JAVA进程被kill的原因的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工行world奋斗信用卡好批吗
- 下一篇: java 里如何实现逻辑返回值_☆技术问