Java虛擬機性能監控與故障處理工具

在這裏插入圖片描述
上圖是jdk/bin目錄下面的exe可執行文件,我們都知道有一個叫做java.exe和javac.exe,但是偉大的jdk默默的爲我們加入了這麼多工具,我們先介紹其中幾個重要工具。

JDK命令行工具

jps:虛擬機進程狀態工具

jps的全稱,JDK Process Status,熟悉linux的同學都知道ps命令,所以jps也就類似於ps命令,用來查看系統中所有的HotSpot虛擬機進程。

  • q 省略主類名稱
  • m 輸出傳給main的參數
  • l 輸出主類全名
  • v 輸出啓動參數
jps -l

在這裏插入圖片描述
這裏顯示的是我電腦上的java進程,可以看到我電腦上啓動了finalshell,Proxyee,等應用,也就能判斷出這些軟件就是用java寫的了。

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

jstat全稱:JVM statistics-Monitoring Tool,用於監視虛擬機各種運行狀態信息的命令行工具,顯示本地或***遠程***虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。

  • class 監視類裝載、卸載數量、總空間以及類裝載所耗費的時間
  • gc 監視堆狀態
  • gccapacity 基本與-gc相同,
  • gcutil 基本與gc相同
  • gccause 與gcutil功能一樣, 但是會額外輸出一次上次gc原因
  • gcnew 監視新生代的gc情況
  • gcnewcapacity 監視內容與-gcnew基本相同,輸出主要關注到的最大、最小空間
  • gcold 老年代gc
  • gcoldcapacity 與gcold基本相同
  • gcperncapacity 輸出永久代使用的最大最小空間
  • compiler 輸出JIT編譯器編譯過的方法、耗時等信息
  • printcompilation 輸出已經被JIT編譯過的方法
jstat -gc 15960 250 20

在這裏插入圖片描述

S0C:年輕代中第一個survivor(倖存區)的容量 (字節)
S1C:年輕代中第二個survivor(倖存區)的容量 (字節)
S0U:年輕代中第一個survivor(倖存區)目前已使用空間 (字節)
S1U:年輕代中第二個survivor(倖存區)目前已使用空間 (字節)
EC:年輕代中Eden(伊甸園)的容量 (字節)
EU:年輕代中Eden(伊甸園)目前已使用空間 (字節)
OC:Old代的容量 (字節)
OU:Old代目前已使用空間 (字節)
PC:Perm(持久代)的容量 (字節)
PU:Perm(持久代)目前已使用空間 (字節)
YGC:從應用程序啓動到採樣時年輕代中gc次數
YGCT:從應用程序啓動到採樣時年輕代中gc所用時間(s)
FGC:從應用程序啓動到採樣時old代(全gc)gc次數
FGCT:從應用程序啓動到採樣時old代(全gc)gc所用時間(s)
GCT:從應用程序啓動到採樣時gc用的總時間(s)
NGCMN:年輕代(young)中初始化(最小)的大小 (字節)
NGCMX:年輕代(young)的最大容量 (字節)
NGC:年輕代(young)中當前的容量 (字節)
OGCMN:old代中初始化(最小)的大小 (字節)
OGCMX:old代的最大容量 (字節)
OGC:old代當前新生成的容量 (字節)
PGCMN:perm代中初始化(最小)的大小 (字節)
PGCMX:perm代的最大容量 (字節)
PGC:perm代當前新生成的容量 (字節)
S0:年輕代中第一個survivor(倖存區)已使用的佔當前容量百分比
S1:年輕代中第二個survivor(倖存區)已使用的佔當前容量百分比
E:年輕代中Eden(伊甸園)已使用的佔當前容量百分比
O:old代已使用的佔當前容量百分比
P:perm代已使用的佔當前容量百分比
S0CMX:年輕代中第一個survivor(倖存區)的最大容量 (字節)
S1CMX :年輕代中第二個survivor(倖存區)的最大容量 (字節)
ECMX:年輕代中Eden(伊甸園)的最大容量 (字節)
DSS:當前需要survivor(倖存區)的容量 (字節)(Eden區已滿)
TT: 持有次數限制
MTT : 最大持有次數限制
官方解釋

jinfo:Java配置信息工具

jinfo:Configuration Info for Java 實時查看和調整虛擬機各項參數。jps -v可以查看顯式指定的參數,如果系那個知道未被顯式指定的參數的系統默認值,就是用jinfo -flag 進行查找。

jinfo -flag UseCMSInitiatingOccupancyOnly 7220

在這裏插入圖片描述
UseCMSInitiatingOccupancyOnly 指示只有在老年代在使用了初始化的比例後 concurrent collector 啓動收集 這裏顯示 - 說明沒有開啓。

jmap:Java內存映像工具

jmap:Memoory Map for Java,命令用於生成堆轉儲快照,如果不使用Jmap命令,要想獲取Java堆轉儲快照,就需要將-XX:+HeapDumpOutOfMemoryError參數設置一下,讓虛擬機在異常的時候自動生成dump文件,

  • dump 生成java堆轉儲快照
  • finalizerinfo 顯示F-Queue中等待Finalizer線程執行finalize方法的對象,只在linux,Solaris中有效
  • heap 顯示Java堆詳細信息,
  • histo 顯示堆中對象統計信息,
  • permstat 以ClassLoader爲統計口徑顯示永久代內存狀態
  • F 強制生成dump快照
jmap -histo 20495

在這裏插入圖片描述

jmap -dump:format=b,file=eclipse.bin 20495

在這裏插入圖片描述

Jhat:虛擬機堆轉儲快照分析工具

Jhat:JVM Heap Analysis Tool,用來分許jmap生成的堆轉儲快照,jhat內置了一個微型的HTTP/HTML服務器,生成dump文件的分析結果後,可以在瀏覽器中查看,
在這裏插入圖片描述
服務起來之後在瀏覽器查看:
在這裏插入圖片描述

jstack:Java堆棧跟蹤工具

jstack:Stack Trace for Java,命令用於生成虛擬機當前時刻的線程快照,就是當前虛擬機的每一條線程執行的方法堆棧的集合,主要目的是定位線程出現長時間停頓的原因,線程停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在後臺做什麼事情,或者等待着什麼資源。

  • F 強制輸出線程堆棧
  • l 除堆棧外,顯示關於鎖的附加信息
  • m 調用本地棧的堆棧
jstack -l 7454

在這裏插入圖片描述

[root@VM_0_2_centos ~]# jstack -l 7454
2019-12-05 09:39:28
Full thread dump OpenJDK 64-Bit Server VM (25.232-b09 mixed mode):

"Attach Listener" #8 daemon prio=9 os_prio=0 tid=0x00007ff814001000 nid=0x246d waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x00007ff83c117800 nid=0x1d33 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C1 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007ff83c114800 nid=0x1d32 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007ff83c106000 nid=0x1d2c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007ff83c103800 nid=0x1d2a runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007ff83c0da000 nid=0x1d25 in Object.wait() [0x00007ff840246000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000f0808ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
        - locked <0x00000000f0808ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)

   Locked ownable synchronizers:
        - None

"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007ff83c0d5000 nid=0x1d23 in Object.wait() [0x00007ff840347000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000f0806c00> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x00000000f0806c00> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

   Locked ownable synchronizers:
        - None

"main" #1 prio=5 os_prio=0 tid=0x00007ff83c04b800 nid=0x1d1f waiting on condition [0x00007ff843bdc000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at Test.main(Test.java:6)

   Locked ownable synchronizers:
        - None

"VM Thread" os_prio=0 tid=0x00007ff83c0cb800 nid=0x1d22 runnable 

"VM Periodic Task Thread" os_prio=0 tid=0x00007ff83c11a000 nid=0x1d34 waiting on condition 

JNI global references: 5

可以看到,main線程現在是waiting狀態,還有其他好多線程就不講解了。

JConsole :

這個工具就是各種監控都可以看到的。jdk bin目錄下面。
在這裏插入圖片描述
在這裏插入圖片描述

visualvm:All-In-One

最後祭出大殺器,visualvm,多合一故障處理工具,裏面插件很多,集合在一起,在bin目錄下面,jvisualvm.exe
在這裏插入圖片描述

發佈了25 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章