背景
測試環境出現的情況,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程序退出