查看虛擬機進程: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
- JVM基礎系列開篇:為什么要學虛擬機?
- JVM基礎系列第1講:Java 語言的前世今生
- JVM基礎系列第2講:Java 虛擬機的歷史
- JVM基礎系列第3講:到底什么是虛擬機?
- JVM基礎系列第4講:從源代碼到機器碼,發生了什么?
- JVM基礎系列第5講:字節碼文件結構
- JVM基礎系列第6講:Java虛擬機內存結構
- JVM基礎系列第7講:JVM類加載機制
- JVM基礎系列第8講:JVM 垃圾回收機制
- JVM基礎系列第9講:JVM垃圾回收器
- JVM基礎系列第10講:垃圾回收的幾種類型
- JVM基礎系列第11講:JVM參數之堆棧空間配置
- JVM基礎系列第12講:JVM參數之查看JVM參數
- JVM基礎系列第13講:JVM參數之追蹤類信息
- JVM基礎系列第14講:JVM參數之GC日志配置
- JVM基礎系列第15講:JDK性能監控命令