閒話少說,直接上乾貨!直接上乾貨!直接上乾貨!運行環境為JAVA8。
一、jps(JVM Process Status Tool)
虛擬機進程狀態工具
1.1 功能介紹
列出正在運行的虛擬機進程,並顯示虛擬機執行的主類(main函數所在的類)名稱以及這些進程的本地虛擬機唯一ID(Local Virtual Machine Identifier,LVMID),相當於Linux下的ps,不過它只列舉Java進程。
1.2 命令格式
<code>jps [-q] [-mlvV] []:
[:
] /<code>
1.3 使用舉例
1.3.1 列出Java程序進程ID和Main函數名稱
<code>jps,等同於jps –V /<code>
1.3.2 只輸出進程ID
<code>jps
–q /<code>
1.3.3 輸出傳遞給Java進程(主函數)的參數
<code>jps
–m /<code>
1.3.4 輸出主函數的完整路徑
<code>jps
–l /<code>
1.3.5 顯示傳遞給Java虛擬的參數
<code>jps
–v /<code>
1.3.6 列出遠程機器JVM實例
默認連接端口為1099,需要遠程機器開啟RMI服務
二、jstat(JVM Statistics Monitoring Tool)
虛擬機統計信息監視工具
2.1 功能介紹
用於監視虛擬機各種運行狀態信息的命令行工具。它可以用來顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集JIT編譯等運行時數據。需要先用jps命令查詢出java進程的vmid。
2.2 命令格式
<code>jstat -<
option
> [-t] [-h<
lines
>]<
vmid
> [<
interval
> [<
count
>]] /<code>
option由以下值構成:
<code> -class
:監視類裝載、卸載數量、總空間以及類裝載所耗費的時間 -compiler: 輸出JIT編譯器編譯過的方法、耗時等信息 -gc:監視Java堆狀況,包括Eden區、兩個survivor區、老年代、永久帶等的容量、已用空間、GC時間合計等信息 -gccapacity:監視內容與-gc基本相同,但輸出主要關注Java堆各個區域使用到的最大、最小空間 -gcutil:監視內容與-gc基本相同,但輸出主要關注已使用空間佔總空間的百分比 -gccause:與-gcutil功能一樣,但會額外輸出導致上一次GC產生的原因 -gcnew:監視新生代GC狀況 -gcnewcapacity:監視內容與-gcnew基本相同,輸出主要關注使用到的最大、最小空間 -gcold:監視老年代GC狀況 -gcoldcapacity:監視內容與-gcold基本相同,輸出主要關注使用到的最大、最小空間 -gcmetacapacity:輸出永久代使用到的最大、最小空間 -printcompilation:輸出已經被JIT編譯方法 -t:在輸出信息前加上一個Timestamp列,顯示程序的運行時間 -h:可以在週期性數據輸出後,輸出多少行數據後,跟著一個表頭信息 interval:用於指定輸出統計數據的週期,單位為毫秒 count:用於指定一個輸出多少次數據 /<code>
2.3 使用舉例
2.3.1 輸出ClassLoader信息
<code>jstat
-class
-t
5993
1000
2
/<code>
2.3.2 查看JIT編譯信息
<code>jstat
-compiler -t5993
/<code>
<code>結果含義:Compiled:編譯任務執行次數; Failed:編譯失敗次數; Invalid:編譯不可用次數 Time:編譯總耗時 FailedType:最後一次編譯失敗類型 FailedMethod:最後一次編譯失敗的類名和方法名 /<code>
2.3.3 GC相關堆信息
<code>jstat
-gc5993
/<code>
<code>結果含義:S0C,S1C:S0(to區)和S1(from
區)大小KB S0U,S1U:S0(to區)和S1(from
區)已使用大小KB EC,OC,MC,CCSC:eden,old,metaspace,compressedclass
space
大小KB
EU,OU,MC,CCSU:eden,old,metaspace,compressedclass
space
已使用大小KB
YGC,FGC:新生代GC,FullGC次數 YGCT,FGCT:新生代GC,FullGC耗時 GCT:GC總耗時 /<code>
2.3.4 查看各個代大小
<code>jstat
-gccapacity5993
/<code>
結果含義:
<code>NGCMN
:年輕代(young)中初始化(最小)的大小(字節)NGCMX
:年輕代(young)的最大容量(字節)NGC
:年輕代(young)中當前的容量(字節)S0C
:年輕代中第一個survivor
(倖存區)的容量(字節)S1C
:年輕代中第二個survivor
(倖存區)的容量(字節)EC
:年輕代中Eden
(伊甸園)的容量(字節)OGCMN
:old
代中初始化(最小)的大小(字節)OGCMX
:old
代的最大容量(字節)OGC
:old
代當前新生成的容量(字節)OC
:old
代的容量(字節)MCMN
:metaspace
中初始化(最小)的大小(字節)MCMX
:metaspace
的最大容量(字節)MC
:metaspace
的容量(字節)MCMN
:compressed
class
space
中初始化(最小)的大小(字節)MCMX
:compressed
class
space
的最大容量(字節)CCSC
:compressed
class
space
的容量(字節)YGC
:從應用程序啟動到採樣時年輕代中gc
次數FGC
:從應用程序啟動到採樣時old
代full
gc
次數 /<code>
2.3.5 查看相關百分比
<code>jstat
-gcutil5993
/<code>
結果含義:
<code>S0
:年輕代中第一個survivor
(倖存區)已使用的佔當前容量百分比S1
:年輕代中第二個survivor
(倖存區)已使用的佔當前容量百分比E
:年輕代中Eden
(伊甸園)已使用的佔當前容量百分比O
:old
代已使用的佔當前容量百分比M
:metaspace
已使用的佔當前容量百分比CCS
:compressed
class
space
已使用的佔當前容量百分比YGC
:從應用程序啟動到採樣時年輕代中gc
次數YGCT
:從應用程序啟動到採樣時年輕代中gc
所用時間(s)FGC
:從應用程序啟動到採樣時old
代(full gc)gc
次數FGCT
:從應用程序啟動到採樣時old
代(full gc)gc
所用時間(s)GCT
:從應用程序啟動到採樣時gc
用的總時間(s) /<code>
2.3.6 顯示GC原因
<code>jstat
-gccause5993
/<code>
結果含義:
<code> LGCC:上次GC原因 GCC:此次GC原因 其他各項含義與-gcutil相同 /<code>
2.3.7 查看新生代詳細參數
<code>jstat
-gcnew5993
/<code>
<code>結果含義:S0C
:年輕代中第一個survivor
(倖存區)的容量 (字節)S1C
:年輕代中第二個survivor
(倖存區)的容量 (字節)S0U
:年輕代中第一個survivor
(倖存區)目前已使用空間 (字節)S1U
:年輕代中第二個survivor
(倖存區)目前已使用空間 (字節)TT
:對象在新生代存活的次數MTT
:對象在新生代存活的最大次數DSS
:期望的倖存區大小EC
:年輕代中Eden
(伊甸園)的容量 (字節)EU
:年輕代中Eden
(伊甸園)目前已使用空間 (字節)YGC
:從應用程序啟動到採樣時年輕代中gc
次數YGCT
:從應用程序啟動到採樣時年輕代中gc
所用時間(s) /<code>
2.3.8 年輕代對象的信息及其佔用量
<code>jstat
-gcnewcapacity5993
/<code>
<code>結果含義:NGCMN
:年輕代(young)中初始化(最小)的大小(字節)NGCMX
:年輕代(young)的最大容量 (字節)NGC
:年輕代(young)中當前的容量 (字節)S0CMX
:年輕代中第一個survivor
(倖存區)的最大容量 (字節)S0C
:年輕代中第一個survivor
(倖存區)的容量 (字節)S1CMX
:年輕代中第二個survivor
(倖存區)的最大容量 (字節)S1C
:年輕代中第二個survivor
(倖存區)的容量 (字節)ECMX
:年輕代中Eden
(伊甸園)的最大容量 (字節)EC
:年輕代中Eden
(伊甸園)的容量 (字節)YGC
:從應用程序啟動到採樣時年輕代中gc
次數FGC
:從應用程序啟動到採樣時old
代(full gc)gc
次數 /<code>
2.3.9 old代對象的信息
<code>jstat
-gcold5993
/<code>
<code>結果含義:MC
:metaspace
的容量 (字節)MU
:metaspace
目前已使用空間 (字節)CCSC
:compressed
class
space
的容量 (字節)CCSU
:compressed
class
space
目前已使用空間 (字節)OC
:old
代的容量 (字節)OU
:old
代目前已使用空間 (字節)YGC
:從應用程序啟動到採樣時年輕代中gc
次數FGC
:從應用程序啟動到採樣時old
代(full gc)gc
次數FGCT
:從應用程序啟動到採樣時old
代(full gc)gc
所用時間(s)GCT
:從應用程序啟動到採樣時gc
用的總時間(s) /<code>
2.3.10 old代對象的信息及其佔用量
<code>jstat
-gcoldcapacity5993
/<code>
<code>結果含義:OGCMN
:old
代中初始化(最小)的大小 (字節)OGCMX
:old
代的最大容量(字節)OGC
:old
代當前新生成的容量 (字節)OC
:Old
代的容量 (字節)YGC
:從應用程序啟動到採樣時年輕代中gc
次數FGC
:從應用程序啟動到採樣時old
代(full gc)gc
次數FGCT
:從應用程序啟動到採樣時old
代(full gc)gc
所用時間(s)GCT
:從應用程序啟動到採樣時gc
用的總時間(s) /<code>
2.3.11 metaspace對象的信息及其佔用量
<code>jstat
-gcmetacapacity5993
/<code>
<code>結果含義:MCMN:最小metaspace容量 MCMX:最大metaspace容量 MC:當前metaspace空間大小 CCSMN:最小compressedclass
space
空間大小 CCSMX:最大compressedclass
space
空間大小 CCSC:當前compressedclass
space
空間大小 YGC:年輕代垃圾回收次數 FGC:老年代垃圾回收次數 FGCT:老年代垃圾回收消耗時間 GCT:垃圾回收消耗總時間 /<code>
2.3.12 JVM編譯方法統計
<code>jstat
-printcompilation5993
/<code>
<code>結果含義:Compiled:最近編譯方法的數量 Size:最近編譯方法的字節碼數量 Type:最近編譯方法的編譯類型 Method:方法名標識 /<code>
三、jinfo(Configuration Info for Java)
Java配置信息工具
3.1 功能介紹
實時查看和調整虛擬機各項參數。需要先用jps查詢出java進程的pid。
3.2 命令格式
<code>jinfo
[option]
<pid
>jinfo
[option]
<executable
<core
>jinfo
[option]
[server_id@]
<remote
server
IP
or
hostname
> /<code>
<code>參數說明:pid:對應jvm的進程id
executable core:產生core dump文件 remote server IP or hostname:遠程的ip或者hostname server-id
:標記服務的唯一性id
/<code>
<code> option取值:no
option:輸出全部的參數和系統屬性 -flag name:輸出對應名稱的參數 -flag [+|-]name:開啟或者關閉對應名稱的參數 -flag name=value:設定對應名稱的參數 -flags:輸出全部的參數 -sysprops:輸出系統屬性 /<code>
3.3 使用舉例
3.3.1 輸出虛擬機參數
<code>jinfo
-flags5993
/<code>
3.3.2 輸出系統屬性
<code>jinfo
-sysprops5993
/<code>
3.3.3 輸出對應名稱的參數
<code>jinfo
-flag PrintGCDetails5993
/<code>
3.3.4 開啟或者關閉對應名稱的參數
<code>jinfo
-flag +PrintGCDetails5993
/<code>
四、jmap(Memory Map for Java)
Java內存映像工具
4.1 功能介紹
功能介紹:用於生成堆轉儲快照(稱為heapdump或dump文件),當然也可以在啟動時通過設置-XX:+HeapDumpOnOutOfMemoryError參數讓虛擬機在OOM異常出現之後自動生成dump文件。jmap的作用還包括查詢finalize執行隊列、java堆和類加載的詳細信息,如空間使用率、當前使用的是哪種垃圾收集器等。需要先用jps查詢出java進程的pid。
4.2 命令格式
<code>jmap
[option]
<pid
>jmap
[option]
<executable
<core
>jmap
[option]
[server_id@]
<remote
server
IP
or
hostname
> /<code>
<code> 參數說明:pid:對應jvm的進程id executable core:產生coredump
文件 remote server IPor
hostname:遠程的ip或者hostname server-id:標記服務的唯一性id option取值:-dump
:生成Java堆轉儲快照。格式為:jmap -dump
:[live,]format
=b,file= pid,live表示只dump
出存活的對象。 -finalizerinfo:顯示在F-Queue中等待Finalizer線程執行finalize方法的對象。只在Linux/Solaris平臺下有效。 -heap:顯示Java堆詳細信息,如使用哪種回收器、參數配置、分代狀況等。只在Linux/Solaris平臺下有效。 -histo:顯示堆中對象統計信息,包括類、實例數量、合計容量。 -clstats:顯示類加載器統計信息。 -F:當虛擬機進程對-dump
選項沒有響應時,可使用這個選項強制生成dump
快照。只在Linux/Solaris平臺下有效。 /<code>
4.3 使用舉例
4.3.1 生成堆轉儲快照
4.3.2 顯示類加載器統計信息
4.3.3 觀察系統finalizer隊列中的對象
不恰當的finalize()方法可能導致對象堆積在finalizer隊列中,使用-finalizerinfo參數可以查看堆積在finalizer隊列中的對象。
4.3.4 顯示堆中對象統計信息,類名、實例數量、所佔容量
4.3.5 顯示Java堆詳細信息
五、jstack(Stack Trace for Java)
Java堆棧跟蹤工具
5.1 功能介紹
堆棧跟蹤工具用於生成虛擬機當前時刻的線程快照(一般稱為threaddump或javacore文件)。線程快照就是當前虛擬機內每條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致長時間等待都是導致線程長時間停頓的常見原因。下面這些狀態是我們使用jstack命令查看線程堆棧信息時可能會看到的線程的幾種狀態:
- 1)NEW:未啟動的。不會出現在Dump中;
- 2)RUNNABLE:在虛擬機內執行的。運行中狀態,可能裡面還能看到locked字樣,表明它獲得了某把鎖;
- 3)BLOCKED:受阻塞並等待監視器鎖。被某個鎖(synchronizer)給block住了;
- 4)WATING:無限期等待另一個線程執行特定操作。等待某個condition或monitor發生,一般停留在park(),wait(),sleep(),join() 等語句裡;
- 5)TIMED_WATING:有時限的等待另一個線程的特定操作。和WAITING的區別是wait()等語句加上了時間限制 wait(timeout);
- 6)TERMINATED:已退出的。
5.2 命令格式
<code>jstack
[-l]
<pid
>jstack
-F
[-m]
[-l]
<pid
>jstack
[-m]
[-l]
<executable
> <core
>jstack
[-m]
[-l]
[server_id@]
<remote
server
IP
or
hostname
> /<code>
<code> 參數說明:pid:對應jvm的進程id
executable core:產生core dump文件 remote server IP or hostname:遠程的ip或者hostname server-id
:標記服務的唯一性id
-m:如果調用到本地方法的話,可以顯示C/C++的堆棧 -l:除堆棧外,顯示關於鎖的附加信息 /<code>
5.3 使用舉例
查看死鎖線程