天天看點

Java服務程序異常消失退出排查思路

背景

測試環境出現的情況,Java服務隔兩分鐘左右程序就消失了,啥也沒有留下

正常的排查思路

程序消失有以下幾種情況:

1.系統殺掉程序

2.JVM奔潰(自身問題),應該是很少出現的

3.OOM導緻的退出

4.一些運維政策,比如某項名額超過門檻值後,kill掉該程序,或者是自動拉起(會kill掉原程序,然後重新開機)

按照最可能出現的情況一一排查:

OOM導緻的退出

一般這種情況下,在Java啟動參數上加上配置(當發生OOM時自動dump記憶體快照),然後下載下傳記憶體快照,使用工具分析,很容易發現是哪裡出了問題

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath={快照存貯路徑}
           

如果你在對應的路徑發現了記憶體快照,那麼基本可以确定就是OOM導緻的

Linux系統主動殺掉了程序

Linux系統在記憶體不足時,會主動去殺掉一些程序,OOM-Killer機制

預設配置下,日志檔案儲存在/var/log目錄下,是以可以去該檔案夾下搜尋即可

fgrep -i -r 'killed process' /var/log
           

如果搜尋出了Out of memory相關的日志,則基本可以确定是機器記憶體不足。

JVM自身奔潰

JVM自身故障導緻程序沒有時,會有一個hs_err_pid_xxx.log的檔案生成,它包含了導緻crash的重要資訊,通過分析檔案來查找crash原因。

該檔案的目錄,預設是在工作目錄下,同樣也可以通過Java啟動參數來設定

-XX:ErrorFile=/var/log/hs_err_pid.log
           

公司的運維政策等,比如健康檢查或者其他

大部分公司都會對服務做健康檢查,比如檢測某個端口是否開啟等等,如果端口配置錯誤或者服務啟動過慢或者其他一些原因,可能會觸發自動拉起邏輯(kill掉該程序并且重新開機)

這種場景下,是無法找到相關的日志的。

我這邊程序不斷被殺的原因

原來是服務配置的健康檢查導緻的,由于服務同時開啟http端口和dubbo端口,配置的是檢測http的端口(是以程序每次都起了,但是檢測不到端口)

原來是服務進行重構時,把http和rpc給剝離了,導緻rpc的服務隻起了dubbo端口,進而一直被自動拉起。

參考文檔

哪些原因導緻java程序退出