Java虛擬機-常用工具

“工欲善其事必先利其器”。

一、命令行工具

1. jps

JVM Process Status Tool,顯示虛擬機進程。這個命令的使用頻率很高,當服務器上運行大量Java項目的時候,系統管理員會通過該命令來查看對應的進程是否啓動。

用法jps [-q] [-mlvV]

參數說明

  • -q:打印進程號
  • -l:打印啓動類的全限定名
  • -m:打印啓動類的 main 方法入參
  • -v:打印指定的虛擬機參數
  • -V:打印類名

例子jpsjps -l

2、jstat

JVM statistics Monitoring,對Java虛擬機內存進行監控統計,包括類裝載、內存、垃圾收集、JIT編譯信息等。該命令通常與jps命令一起使用,先通過jps查看當前服務器上運行有哪些進程,獲取到對應的進程號後再使用jstat來查看該進程的具體信息。

用法jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

參數說明

  • option:操作,參數比較多,常用的是gcutil,統計垃圾回收情況。
    • -class:監控類裝載,卸載數量,總空間以及消費的時間
    • -gc:垃圾回收堆的行爲統計(常用命令)  
    • -gccapacity:同-gc,同時還會輸出JAVA堆各區域的使用到的最大、最小空間
    • -gcutil:同-gc,輸出的是已使用空間佔總空間的百分比
    • -gccause:在-gcutil的基礎上附加最近兩次垃圾回收時間的原因
  • -t:顯示時間戳列
  • -h:指定多少行顯示標題
  • -vmid:進程ID
  • -interval:每行輸出的時間間隔
  • -count:指定輸出行數

例子jstat -gcutil -h2 -t 11904 100 5,表示監控進程號11904的垃圾收集統計值,每隔100ms輸出一行,總共輸出5次,每輸出2次需要重新輸出標題。

D:\>jstat -gcutil -h2 -t 11904 100 5
Timestamp         S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
         1252.1   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007
         1252.2   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007
Timestamp         S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
         1252.3   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007
         1252.5   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007
Timestamp         S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
         1252.6   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007

輸出的指標說明

  • S0:survivor 0 已用空間佔比
  • S1:survivor 1 已用空間佔比
  • E:Eden 區已用空間佔比
  • O:老年代已用空間佔比
  • M:元數據已用空間佔比
  • CCS:壓縮類空間佔比
  • YGC:Minor GC 次數
  • YGCT:Minor GC 消耗時間
  • FGC:Full GC 次數
  • FGCT:Full GC 消耗時間
  • GCT:垃圾回收消耗總時間

元空間M就是永久代的替代產物。

3. jinfo

JVM Configuration info,可以實時查看和實時修改虛擬機參數。jinfo 是 JDK 自帶的命令,可以用來查看正在運行的 java 應用程序的擴展參數,包括Java System屬性和JVM命令行參數;也可以動態的修改正在運行的 JVM 一些參數。當系統崩潰時,jinfo可以從core文件裏面知道崩潰的Java應用程序的配置信息

用法jinfo [option] <pid>

參數說明

  • option:操作

-flag 打印指定的VM參數的值
-flag [+|-] 啓用或禁用指定的VM參數
-flag = 修改VM參數
-flags 打印VM參數
-sysprops 打印Java系統配置

  • pid:進程ID

例子

#查看指定的進程是否使用了G1垃圾回收器
D:\>jinfo -flag UseG1GC 11904
-XX:-UseG1GC

4. jmap

JVM Memory Map,用來生成堆棧dump文件。可查看的信息如下:

  • 查看堆各個對象的數量,大小
  • dump堆裏的對象信息,然後可以用MAT分析
  • 查看堆的配置情況和GC算法
  • 查看堆永久代信息

用法jmap [option] <pid>

參數說明

  • option:操作

heap:打印Java堆摘要
histo[:live]:打印java對象堆的直方圖; 如果指定了“live”選項,則僅計算實時對象
dump:生成dump快照

  • pid:進程ID

例子

jmap -heap 15754
jmap -histo:live 15754
jmap -dump:live,file=.\heap_dump.hprof 15754

5. jstack

用來生成Java虛擬機當前時刻的線程快照,方便定位線程長時間停頓的問題,比如死鎖、死循環、長時間等待等。

用法jstack -F [-m] [-l] <pid>

參數說明

  • -F:強制打印堆棧
  • -m:同時打印Java和本地方法的堆棧
  • -l:打印關於鎖的附件信息
  • pid:進程ID

例子

D:\>jstack -l 11904
2020-04-03 15:54:36
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.211-b12 mixed mode):

"RMI TCP Connection(idle)" #36 daemon prio=5 os_prio=0 tid=0x000000001a27a000 nid=0x3bd0 waiting on condition [0x000000001c3ee000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000d0687c48> (a java.util.concurrent.SynchronousQueue$TransferStack)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
        at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
        at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
        at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1073)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

這個打印的信息跟我們在Java代碼中使用Thread.getAllStackTraces()方法獲取的內容是一致的。 

6. jhat

JVM Heap Analysis Tool,用來分析jmap生成的堆棧日誌,生成HTML文件。jhat命令對於內存和cpu的佔用率非常高,通常不會在服務器上直接進行分析,而是拷貝到本地再進行分析。該命令執行完畢後會啓動一個簡易的HTTP服務,端口號是7000,本地可以通過http://localhost:7000訪問,生成的html頁面如下所示:

查看堆異常主要關注兩個:

  • Show instance counts for all classes (excluding platform) 平臺外的所有對象信息
  • Show heap histogram 先是堆的統計信息

這個命令功能非常強大,但使用率不是很高,我們一般會用可視化工具來分析堆棧日誌,比如MAT。

7. jcmd

JDK建議使用 jcmd 替代 jstack、jinfo、jmap 等命令。

例子

  • jcmd -l:列出所有Java虛擬機。
  • jcmd 15754 help:列出該虛擬機支持的命令。
  • jcmd 15754 PerfCounter.print:獲取所有性能相關的數據。
  • jcmd 15754 GC.class_histogram

二、可視化工具

jconsole:JDK自帶監控工具:內存監控、線程監控、檢測死鎖

jvisualvm:JDK自帶監控工具,比jconsole顯示更多監控數據

jmc:也是JDK自帶監控工具,比jvisualvm顯示更多監控數據

MAT:Memory Analyzer Tool,Java虛擬機內存分析工具,能夠快速的分析dump日誌。

官網下載地址:https://www.eclipse.org/mat/

三、虛擬機工具思維導圖

參考資料:

  1. https://www.cnblogs.com/bigshark/p/11253590.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章