值此七夕佳節,煙哥放棄了無數妹紙的邀約,坐在電腦面前碼字,就是爲了給讀者帶來新的知識,這是一件偉大的事業!
好吧,實際狀況是沒人約。爲了化解尷尬,我決定賣力寫文章,嗯,必定是我過於屌絲!
好了,開始說重點。今天講的這個問題java
JVM進程消失可能有哪些緣由?
這個問題也是面試中常常出現的,以下圖所示
linux
ps:
因爲兩年多沒寫crud了,因此忘記mybatis怎麼用了,因此上面那個問題,我選擇了無視。面試
那咱們就開一篇文章說一下這個問題,其實很easy的,無外乎三種狀況。緩存
Linux 內核有個機制叫OOM killer(Out-Of-Memory killer),該機制會監控那些佔用內存過大,尤爲是瞬間很快消耗大量內存的進程,爲了防止內存耗盡而內核會把該進程殺掉。
所以,你發現java進程忽然沒了,首先要懷疑是否是被linux的OOM killer給幹掉了!
你能夠去下面這個文件裏翻安全
/var/log/messages
你執行命令服務器
egrep -i 'killed process' /var/log/messages
去日誌裏進行查詢。
固然,你也能夠去內核日誌裏頭查詢。有時Linux系統或者系統上運行的java或者其它進程,會發生一些莫名其妙的問題,好比忽然掛掉了,好比忽然重啓等等。在軟件上找不到問題所在,此時咱們應該懷疑硬件或者內核的問題,此時咱們就可使用 dmesg來查看:mybatis
dmesg | grep java
輸出以下jvm
[5673702.665338] Out of memory: Kill process 29953 (java) score 431 or sacrifice child [5673702.665338] Killed process 29953, UID 500, (java) total-vm:9805316kB, anon-rss:2344496kB, file-rss:128kB
徹底是能夠看到內核對進程作對操做。工具
當JVM發生致命錯誤致使崩潰時,會生成一個hs_err_pid_xxx.log這樣的文件,該文件包含了致使 JVM crash 的重要信息,咱們能夠經過分析該文件定位到致使 JVM Crash 的緣由,從而修復保證系統穩定。
默認狀況下,該文件是生成在工做目錄下的,固然也能夠經過 JVM 參數指定生成路徑:線程
-XX:ErrorFile=/var/log/hs_err_pid<pid>.log
這個文件的內容他主要有以下內容
拿到這個文件後,不用說了,慢慢啃吧。說到這裏,我要摸着良心說。這個文件巨複雜,若是要會讀這個文件,請下點功夫。
坦白說,我不多遇到由於JVM的OOM,致使java進程退出的狀況。
由於,通常狀況下,出現OOM異常,JVM的GC會進行回收,是不會致使JVM進程退出的。要真說惟一致使退出的狀況,那就是內存泄漏,因爲內存佔用愈來愈大,結果。。。。
不過這種JVM的OOM致使的異常,很好排查。
由於,你注意兩個個參數
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=*/java.hprof;
而後去找dump快照文件,接下來藉助VisualVM這種可視化工具分析就行。很容易定位問題。
綜上所述,正確回答是。先翻dump文件,dump若是沒有,翻hs_err_pid.log日誌。若是尚未,翻內核日誌。 若是上面尚未,請聯繫煙哥解決。