記一次Java進程突然消失問題
@Date 2017.05.22
現象: 線上同一個應用部署了多臺服務器,有的機器運行過程中突然告警,發現服務進程消失.
- 看程序本身的日志,沒有異常輸出
- 查詢磁盤空間是否不足,沒有此問題
- 增加如下啟動參數,查看GC日志,發現程序無GC出現
-Xloggc:/home/admin/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/admin/logs/java.hprof
- 在上述重啟服務時,發現一個現象,程序重啟沒有多久就消失掉. 此時使用dmesg
查看Linux系統日志, dmesg只能查看到最近的系統緩存日志,所以在現場能還原時查看最合適.
重點:
- 會發現dmesg的日志中出現oom kill的字樣,由此可以判斷應該是機器內存被占滿,系統自動選擇一個占用內存最大的進行kill掉
- 復現確認
- 在啟動應用之后,使用free命令查看機器內存占用情況, 發現total和used相差無幾
- 查看JVM啟動參數以及機器內存配置,發現-Xmx配置和機器內存相等,由此可以斷定是應用啟動堆內存沾滿機器內存,造成系統KILL
解決: 修改JVM啟動參數,最好改成系統內存大小的1/2或者2/3左右即可
總結: 需要區分heap與 non-heap,堆內存不足會有OOM異常,進程無緣無故消失一般就是堆外內存導致
注意: 引起系統OOM-KILL的其他情況還有比如使用VIM編輯大文件, 如果文件過大也會造成撐滿機器內存