JVM基礎系列第15講:JDK性能監控命令


查看虛擬機進程:jps 命令

jps 命令可以列出所有的 Java 進程。如果 jps 不加任何參數,可以列出 Java 程序的進程 ID 以及 Main 函數短名稱,如下所示。

$ jps
6540 Jps
64447 Main

除此之外,還可以指定下面的參數自定義輸出信息:

參數 含義
-q 指定jps只輸出進程ID
-m 輸出傳遞給Java進程的參數
-l 輸出主函數的完整路徑
-v 顯示傳遞給Java虛擬機的參數

虛擬機統計信息:jstat 命令

jstat 用於觀察 Java 堆信息的詳細情況,其基本使用語法位:

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

其中 option 可以由以下值構成。

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

-t 參數表示輸出時間戳、-h 參數表示在多少行后輸出一個表頭、vmid 則是虛擬機的進程ID、interval 和 count 表示輸出間隔以及輸出次數。

例如:我們用jstat命令來監視一個LVMID為2365的JVM進程。

$ jstat -gcutil 2365 
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00  12.05   0.00  14.17      0    0.000     0    0.000    0.000

其中每個選項的意義如下:

參數 含義
S0、S1 表示Survivor0、Survivor1,還未使用。
E 表示Eden區使用了12.05%的空間。
O 表示老年代還未使用。
P 表示永久代使用了14.17%的空間
YUC、YGCT 表示從程序運行以來一共發生了0次Minor GC(YGC,Young GC),總共耗時0秒。
FGC、FGCT 表示從程序運行以來一共發生了0次Full GC(FGC,Full GC),總共耗時0秒。

查看虛擬機參數:jinfo 命令

jinfo 可以用來查看正在運行的 Java 應用程序的擴展參數,甚至支持在運行時,修改部分參數。它的基本語法是:

jinfo <option> <pid>

執行例子,查詢 CMSInitiatingOccupancyFraction 參數值

$ jinfo -flag CMSInitiatingOccupancyFraction 2618
-XX:CMSInitiatingOccupancyFraction=-1

導出堆到文件:jmap 命令

jmap 是一個多功能命令,可以生成 Java 程序的 Dump 文件,也可以查看堆內對象實例的統計信息、查看 ClassLoader 的信息以及 finalizer 隊列。

jmap [option] vmid

執行樣例,使用 jmap 生成一個正在運行的 Eclipse 的 dump 快照文件的例子。例子中的2618是通過jps名稱查詢到的LVMID。

$ jmap -dump:format=b,file=Desktop/dump.bin 2618
Dumping heap to /Users/yurongchan/Desktop/dump.bin ...
Heap dump file created

堆分析工具:jhat 命令

jhat 命令用於分析 Java 應用的對快照內存。Sun JDK 提供了 jhat 命令與 jmap 搭配使用,來分析 jmap 生成的堆轉儲快照。jhat 內置了一個微型的 HTTP/HTML 服務器,生成 dump 文件的分析結果后,可以在瀏覽器中查看。下面我們用 jhat 來分析上面生成的 dump.bin 文件:

$ jhat dump.bin 
Reading from dump.bin...
Dump file created Sun May 15 23:04:19 CST 2016
Snapshot read, resolving...
Resolving 13822 objects...
Chasing references, expect 2 dots..
Eliminating duplicate references..
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

之后在瀏覽器輸入 http://localhost:7000 就可以看到分析結果,如下圖所示:

不過一般情況下不用 jhat 命令來分析 dump 文件,主要有以下兩個原因:一是一般不會再部署應用的服務器上分析 dump 文件,因為分析工作是一個耗時而且消耗硬件資源的過程。另一個原因是 jhat 的分析功能還比較簡陋,比起后面介紹的 VisualVM 等工具還差得很多。

查看線程堆棧:jstack 命令

jstack 命令用於導出 Java 應用程序的線程堆棧。jstack命令格式:

jstack [option] vmid

下面使用jstack查看一個線程對戰的例子:

nobody $ jstack -l 2618
2016-05-15 23:39:04
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.79-b02 mixed mode):
"Attach Listener" daemon prio=5 tid=0x00007f83228e6000 nid=0x280b waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   Locked ownable synchronizers:
    - None
"DestroyJavaVM" prio=5 tid=0x00007f832387e800 nid=0x1303 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   Locked ownable synchronizers:
    - None

遠程主機信息收集:jstatd 命令

jstad 命令用於收集遠程主機信息。

多功能命令行:jcmd 命令

jcmd 命令可以針對給定的 Java 虛擬機執行一條命令。

性能統計工具:hprof


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM