Java虛擬機宕機分析

Java Java虛擬機 編程語言 CPU 深耕IT 2017-04-19

一、能夠引起JVM崩潰的常見原因有:

  1. 線程阻塞

  2. CPU 使用率過高

  3. JVM Crash

  4. 堆內存不足

  5. 類裝載

  6. Java虛擬機自身的Bug

  7. JDK與服務器(CPU、內存、操作系統)的兼容性

  8. 內存溢出

二、日誌文件

hs_err_pid.log,致命錯誤出現的時候,JVM生成了hs_err_pid<pid>.log這樣的文件,其中包含了虛擬機崩潰原因的重要信息:

  • 觸發致命錯誤的操作異常或者信號;

  • 版本和配置信息;

  • 觸發致命異常的線程詳細信息和線程棧;

  • 當前運行的線程列表和它們的狀態;

  • 堆的總括信息;

  • 加載的本地庫;

  • 命令行參數;

  • 環境變量;

  • 操作系統CPU的詳細信息。

JavaCore及HeapDump文件,Java程序運行時,有時會產生JavaCore及HeapDump文件,它一般發生於Java程序遇到致命問題的情況下。有時致命問題發生後,Jvm不會死掉,還能繼續運行,但致命問題發生,Jvm進程會死掉,為了能夠保留Java應用發生致命錯誤前的運行狀態,JVM在宕掉前產生兩個文件,分別為JavaCore及HeapDump文件。

JavaCore文件主要保存的是Java應用各線程在某一時刻的運行的位置,即JVM執行到哪一個類、哪一個方法、哪一個行上。它是一個文本文件,打開後可以看到每一個線程的執行棧,以stack trace的顯示。通過對JavaCore文件的分析可以得到應用是否“卡”在某一點上,即在某一點運行的時間太長,例如數據庫查詢,長期得不到響應,最終導致系統崩潰等情況。

HeapDump文件是一個二進制文件,它保存了某一時刻JVM堆中對象使用情況,這種文件需要相應的工具進行分析。這類文件最重要的作用就是分析系統中是否存在內存溢出的情況。

三、宕機分析

宕機的時候必定會產JavaCore及HeapDump文件,如果未宕機時,想查看Jvm中線程與內存情況,那麼在linux下可通過kill -3 進程號來手工產生這兩個文件來進行分析。

MAT

Eclipse Memory Analyzer是一個非常好用的分析工具,我們可以利用它的Eclipse 插件輕鬆實現查看對象樹、對象大小、生成報告,甚至自動化分析可能出現洩露的對象, 和其他插件的安裝非常類似,MAT 支持兩種安裝方式,一種是“單機版“的,也就是說用戶不必安裝 Eclipse IDE 環境,MAT 作為一個獨立的 Eclipse RCP 應用運行;另一種是”集成版“的,也就是說 MAT 也可以作為 Eclipse IDE 的一部分,和現有的開發平臺集成。

JavaCore文件的頭部有一個“Current Thread Details”標記,它記錄了JavaCore產生時系統運行的線程id,使用線程id在文件中查找線程的詳細信息,該信息中記載了線程運行哪個類的時候造成的JavaCore。

HeapDump文件是指定時刻的Java堆棧的快照,是一種鏡像文件。MAT工具通過分析HeapDump文件,哪些對象佔用了太多的堆棧空間,來發現導致內存洩露或者可能引起內存洩露的對象。

示例:

javacore文件分析:

Java虛擬機宕機分析

由上圖可見,引起javacore的原因是因為內存溢出,但其進程中的線程並未出現明細的異常,見

下圖的線程狀態分析。

Java虛擬機宕機分析

引起javacore的線程如下所示:

Java虛擬機宕機分析

該線程異常如下:

Java虛擬機宕機分析

由此可見,因為內存不足導致了內存溢出,程序不存在異常,那麼接下來通過分析dump來查看內存情況,見下圖:

Java虛擬機宕機分析

Java虛擬機宕機分析

通過上述的dump文件的分析,我們得到內存的可能洩露點有兩個,都是佔用了比較大的內存,通過分析內存洩露點來找到解決辦法。

相關推薦

推薦中...