記一次Java進程突然消失問題

記一次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掉
  • 復現確認
    1. 在啟動應用之后,使用free命令查看機器內存占用情況, 發現total和used相差無幾
    2. 查看JVM啟動參數以及機器內存配置,發現-Xmx配置和機器內存相等,由此可以斷定是應用啟動堆內存沾滿機器內存,造成系統KILL

解決: 修改JVM啟動參數,最好改成系統內存大小的1/2或者2/3左右即可

總結: 需要區分heap與 non-heap,堆內存不足會有OOM異常,進程無緣無故消失一般就是堆外內存導致

注意: 引起系統OOM-KILL的其他情況還有比如使用VIM編輯大文件, 如果文件過大也會造成撐滿機器內存

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 感恩壞種子爆破,早上去上班的路上看到好幾起車禍,有一起在湖底隧道四連撞,看到這些都是無明時有過搶道、插隊、超車現象...
    開荒者cx閱讀 163評論 0 0
  • 如果不曾經歷,又怎么會有頗多感慨。 如果不曾遇見,又如何認識性情之人。 記得之前有人說,你可以什么都沒有,...
    溫潤先生閱讀 372評論 0 1