JVM07-虛擬機故障處理之命令行工具

前言

上一篇我們介紹了JVM06-經典垃圾收集器。這篇文章將介紹用來排查處理虛擬機故障的一些常用的命令行工具。因爲如果我們要對JVM進行調優時,必須要通過這些工具分析虛擬機的運行狀態。

jps: 虛擬機進程狀況工具

jps命令是一個檢查虛擬機進程狀況的工具。它可以列出正在運行的虛擬機進程,並顯示虛擬機執行主類(Main Class)名稱以及這些進程的本地虛擬機唯一ID(LVMID)。
jps 命令的格式是: options 是操作

jps [options] [hostid]

jps執行樣例:

jps -l
16864 com.feifei.ServerApplication
30160 com.feifei.ExtendApplication
22020 com.feifei.ApiInnerApplication

jps還可以通過RMI協議查詢開啓了RMI服務的遠程虛擬機進程狀態,參數hostid爲RMI註冊表中的註冊的主機名,jps的其他常用選項見下表。

選項 作用
-q 只輸出LVMID,省略主類的名稱
-m 輸出虛擬機進程啓動時傳遞給主類main()函數的參數
-l 輸出主類的全名,如果進程執行的是JAR包,則輸出JAR路徑
-v 輸出虛擬機進程啓動時的JVM參數

jstat: 虛擬機統計信息監控工具

jstat是用於監控虛擬機各種運行狀況信息的命令行工具,它可以顯示本地 或者遠程虛擬機進程中的類加載、內存、垃圾收集、即時編譯等運行時數據。
jstat命令格式爲:

jstat [option vmid[interval[s|ms] [count]]]

參數interval和count代表查詢間隔和次數,如果省略這兩個參數,說明只查詢一次,假設需要每250毫秒查詢一次進程27724垃圾收集情況,一共查詢10次,那命令應當是jstat -gc 27724 250 10。查詢後的結果是:

jstat的其他常用選項如下表所示:

選項 作用
-class 監控類加載、卸載數量、總空間以及類裝載所耗費的時間
-gc 監控Java堆狀況,包括Eden區、2個Survivor區、老年代、永久代等的容量,已用空間、垃圾收集時間合計等信息
-gccapacity 監控內容與-gc基本相同,但輸出主要關注已使用Java堆各個區域使用的最大、最小空間
-gcutil 監控內容與-gc基本相同,但輸出主要關注已使用空間佔總空間的百分比
-gccause 與-gcutil功能一樣,但是會額外輸出導致上次垃圾收集產生的原因
-gcnewcapacity 監視內容與-gcnew基本相同,輸出主要關注使用到的最大、最小空間
-gcold 監視老年代垃圾收集狀況
-gcoldcapacity 監控內容與-gcold基本相同,輸出主要關注使用到的最大、最小空間
-gcpermcapacity 輸出永久代使用到的最大、最小空間
-compiler 輸出即時編譯過的方法,耗時等信息
-printcompilation 輸出已經被即時編譯的方法

下面一個監控項目啓動之後的內存狀況的例子:還是以那個進程是27724的爲例:

jstat -gcutil 27724

查詢結果如下:
在這裏插入圖片描述
查詢結果表明:
查詢結果表明:這臺服務器的新生代Eden區(E,表示Eden)使用了99.66%的空間,其中一個Survivor區S0(S0表示Survivor0、S1表示Survivor1)使用了49.22%,S1是空的。老年代(O,表示Old)使用了 28.67%的空間。元空間(M,表示Metaspace)使用了95.25%的空間。程序運行以來共發生Minor GC(YGC,表示Young GC)16次,共耗時(YGCT) 0.248秒,發生Full GC(FGC,表示Full GC)3次,共耗時(FGCT)爲0.420秒,所有GC總耗時(GCT,表示GC Time)爲0.577秒。

jmap: Java 內存映像工具

jmap命令用於生成堆轉儲快照,如果不使用jmap命令,要想獲取Java堆轉儲快照也還有一些比較"暴力"的手段,例如使用 -XX:+HeadDumpOnOutOfMemoryError 參數,可以讓虛擬機在內存溢出異常出現之後自動生成堆轉儲快照文件。
jmap命令格式

jmap [option] vmid

jump 工具主要的選項如下表所示:

選項 作用
-dump 生成Java堆轉儲快照,格式爲-dump:[live,]format=b,file=<filename>,其中live自參數說明是否只dump出存活的對象
-finalizerinfo 顯示在F-Queue中等待Finalizer線程執行finalize方法的對象,只在Linux/Solaris平臺有效
-heap 顯示Java堆詳情信息,如使用哪種回收器、參數配置。分代狀況等。只在Linux/Solaris平臺下有效
-histo 顯示堆中對象統計信息,包括類、實例數量、合計容量
-permstat 以ClassLoader爲統計口徑顯示永久代內存狀態。只在Linux/Solaris平臺有效
-F 以虛擬機進程對-dump選項沒有響應時,可使用這個選項強制生成dump快照。只在Linux/Solaris平臺有效

下面代碼是使用jmap生成一個正在運行的java程序的堆轉儲快照文件的例子,其中27724是通過jps命令查詢到的LVMID

jmap -dump:format=b,file=dump 27724

jstack:Java堆棧跟蹤工具

jstack命令用於生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的目的通常是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間掛起等,都是導致線程長時間停頓的常見原因。
jstack命令格式

jstack [option] vmid

jstack工具主要選項如下表所示:

選項 作用
-F 當正常輸出的請求不被響應時,強制輸出線程堆棧
-l 除堆棧外,顯示關於鎖的附加信息
-m 如果調用到本地方法的話,可以顯示C/C++的堆棧

下面是使用jstack查看 DeadLockTest2主類的堆棧的例子,例子中的17884是通過jps命令查詢到的LVMID。
在這裏插入圖片描述

總結

本文主要介紹了幾種比較實用的處理虛擬機故障的命令行工具,工具本身的使用是非常簡單的。這是需要在工作中靈活使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章