把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

閒話少說,直接上乾貨!直接上乾貨!直接上乾貨!運行環境為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>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

1.3.2 只輸出進程ID

<code>

jps

–q /<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

1.3.3 輸出傳遞給Java進程(主函數)的參數

<code>

jps

–m /<code>

1.3.4 輸出主函數的完整路徑

<code>

jps

–l /<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

1.3.5 顯示傳遞給Java虛擬的參數

<code>

jps

–v /<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

1.3.6 列出遠程機器JVM實例

默認連接端口為1099,需要遠程機器開啟RMI服務

把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

二、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>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

2.3.2 查看JIT編譯信息

<code>

jstat

-compiler -t

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

<code>結果含義:Compiled:編譯任務執行次數;

      Failed:編譯失敗次數;

      Invalid:編譯不可用次數

      Time:編譯總耗時

      FailedType:最後一次編譯失敗類型

      FailedMethod:最後一次編譯失敗的類名和方法名
/<code>

2.3.3 GC相關堆信息

<code>

jstat

-gc

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

<code>結果含義:S0C,S1C:S0(to區)和S1(

from

區)大小KB S0U,S1U:S0(to區)和S1(

from

區)已使用大小KB EC,OC,MC,CCSC:eden,old,metaspace,compressed

class

space

大小

KB

EU,OU,MC,CCSU:eden,old,metaspace,compressed

class

space

已使用大小

KB

YGC,FGC:新生代GC,FullGC次數 YGCT,FGCT:新生代GC,FullGC耗時 GCT:GC總耗時 /<code>

2.3.4 查看各個代大小

<code>

jstat

-gccapacity

5993

/<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

-gcutil

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

結果含義:

<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

-gccause

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

結果含義:

<code>  LGCC:上次GC原因

  GCC:此次GC原因

  其他各項含義與-gcutil相同
/<code>

2.3.7 查看新生代詳細參數

<code>

jstat

-gcnew

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

<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

-gcnewcapacity

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

<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

-gcold

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

<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

-gcoldcapacity

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

<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

-gcmetacapacity

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

<code>結果含義:MCMN:最小metaspace容量

          MCMX:最大metaspace容量

          MC:當前metaspace空間大小

          CCSMN:最小compressed 

class

space

空間大小

CCSMX:最大compressed

class

space

空間大小

CCSC:當前compressed

class

space

空間大小

YGC:年輕代垃圾回收次數 FGC:老年代垃圾回收次數 FGCT:老年代垃圾回收消耗時間 GCT:垃圾回收消耗總時間 /<code>

2.3.12 JVM編譯方法統計

<code>

jstat

-printcompilation

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

<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

-flags

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

3.3.2 輸出系統屬性

<code>

jinfo

-sysprops

5993

/<code>

3.3.3 輸出對應名稱的參數

<code>

jinfo

-flag PrintGCDetails

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

3.3.4 開啟或者關閉對應名稱的參數

<code>

jinfo

-flag +PrintGCDetails

5993

/<code>
把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

四、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:產生core 

dump

文件 remote server IP

or

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 生成堆轉儲快照

把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

4.3.2 顯示類加載器統計信息

把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

4.3.3 觀察系統finalizer隊列中的對象

不恰當的finalize()方法可能導致對象堆積在finalizer隊列中,使用-finalizerinfo參數可以查看堆積在finalizer隊列中的對象。

把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

4.3.4 顯示堆中對象統計信息,類名、實例數量、所佔容量

把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

4.3.5 顯示Java堆詳細信息

把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧

五、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 使用舉例

查看死鎖線程

把玩JDK自帶命令行工具,只為JVM性能優化打下夯實基礎,請收藏吧


分享到:


相關文章: