1. 程式人生 > 實用技巧 >JDK中jps、jinfo、jstat、jstack、jmap、jconsole等命令簡介

JDK中jps、jinfo、jstat、jstack、jmap、jconsole等命令簡介

JDK提供了幾個很實用的工具,如下:

jinfo:觀察執行中的java程式的執行環境引數:引數包括Java System屬性和JVM命令列引數,java class path等資訊。命令格式:jinfo 程序pid
jps:用來顯示本地的java程序,可以檢視本地執行著幾個java程式,並顯示他們的程序號。命令格式:jps 或 jps 遠端服務ip地址 (預設埠1099)
jstat:一個極強的監視VM記憶體工具。可以用來監視VM記憶體內的各種堆和非堆的大小及其記憶體使用量。

jstack:可以觀察到jvm中當前所有執行緒的執行情況和執行緒當前狀態。, 如果現在執行的java程式呈現hung的狀態,jstack是非常有用的。命令格式:jstack 程序pid

當程式出現死鎖的時候,使用命令:jstack 程序ID > jstack.log,然後在jstack.log檔案中,搜尋關鍵字“BLOCKED”,定位到引起死鎖的地方。

jmap:觀察執行中的jvm實體記憶體的佔用情況(如:產生哪些物件,及其數量)。命令格式:jmap [option] pid

option引數如下:
-heap
:列印jvm heap的情況
-histo:列印jvm heap的直方圖。其輸出資訊包括類名,物件數量,物件佔用大小。
-histo:live :同上,但是隻答應存活物件的情況
-permstat:列印permanent generation heap情況

使用jmap進行 heap dump的例子: jmap-dump:format=b,file=<filename><pid>

列印記憶體統計圖:jmap -histo:live <pid>

結果中每行顯示了當前堆中每種類型別的資訊,包含被分配的例項個數及其消耗的位元組數。選項“live”,表示只統計存活的物件

需要注意的是,jmap不是執行分析工具,在生成統計圖時JVM可能會暫停,因此當生成統計圖時需要確認這種暫停對程式是可接受的。
jconsole:一個java GUI監視工具,可以以圖表化的形式顯示各種資料。並可通過遠端連線監視遠端的伺服器VM。

這些命令的使用,見官方文件:
jps:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html
jstat:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html

jstack:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html
jmap:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html
jconsole:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html

jstat的一些引數:

引數名稱

描述

class

統計class loader行為資訊。命令例子:jstat -classpid 1000 10 (每隔1秒監控一次,一共做10次),輸出內容,含義如下:

Loaded Number of classes loaded.
Bytes Number of Kbytes loaded.
Unloaded Number of classes unloaded.
Bytes Number of Kbytes unloaded.
Time Time spent performing class load and unload operations.

compile

統計編譯行為資訊。

gc

輸出每個堆區域的當前可用空間以及已用空間(伊甸園,倖存者等等),GC執行的總次數,GC操作累計所花費的時間。

gccapactiy

輸出每個堆區域的最小空間限制(ms)/最大空間限制(mx),當前大小,每個區域之上執行GC的次數。(不輸出當前已用空間以及GC執行時間)。

gccause

輸出-gcutil提供的資訊以及最後一次執行GC的發生原因和當前所執行的GC的發生原因

gcnew

輸出新生代空間的GC效能資料

gcnewcapacity

輸出新生代空間的大小的統計資料。

gcold

輸出老年代空間的GC效能資料。

gcoldcapacity

輸出老年代空間的大小的統計資料。

gcpermcapacity

輸出持久帶空間的大小的統計資料。

gcutil

輸出每個堆區域使用佔比,以及GC執行的總次數和GC操作所花費的事件。

你可以只關心那些最常用的命令,你會經常用到 -gcutil (或-gccause), -gc and –gccapacity。

· -gcutil 被用於檢查堆間的使用情況,GC執行的次數以及GC操作所花費的時間。

· -gccapacity以及其他的引數可以用於檢查實際分配記憶體的大小。

不同的jstat引數輸出不同型別的列,如下表所示,根據你使用的”jstat option”會輸出不同列的資訊。

說明 Jstat引數
S0C 輸出Survivor0空間的大小。單位KB。 -gc
-gccapacity
-gcnew
-gcnewcapacity
S1C 輸出Survivor1空間的大小。單位KB。 -gc
-gccapacity
-gcnew
-gcnewcapacity
S0U 輸出Survivor0已用空間的大小。單位KB。 -gc
-gcnew
S1U 輸出Survivor1已用空間的大小。單位KB。 -gc
-gcnew
EC 輸出Eden空間的大小。單位KB。 -gc
-gccapacity
-gcnew
-gcnewcapacity
EU 輸出Eden已用空間的大小。單位KB。 -gc
-gcnew
OC 輸出老年代空間的大小。單位KB。 -gc
-gccapacity
-gcold
-gcoldcapacity
OU 輸出老年代已用空間的大小。單位KB。 -gc
-gcold
PC 輸出持久代空間的大小。單位KB。 -gc
-gccapacity
-gcold
-gcoldcapacity
-gcpermcapacity
PU 輸出持久代已用空間的大小。單位KB。 -gc
-gcold
YGC 新生代空間GC時間發生的次數。 -gc
-gccapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccause
YGCT 新生代GC處理花費的時間。 -gc
-gcnew
-gcutil
-gccause
FGC full GC發生的次數。 -gc
-gccapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccause
FGCT full GC操作花費的時間 -gc
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccause
GCT GC操作花費的總時間。 -gc
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccause
NGCMN 新生代最小空間容量,單位KB。 -gccapacity
-gcnewcapacity
NGCMX 新生代最大空間容量,單位KB。 -gccapacity
-gcnewcapacity
NGC 新生代當前空間容量,單位KB。 -gccapacity
-gcnewcapacity
OGCMN 老年代最小空間容量,單位KB。 -gccapacity
-gcoldcapacity
OGCMX 老年代最大空間容量,單位KB。 -gccapacity
-gcoldcapacity
OGC 老年代當前空間容量制,單位KB。 -gccapacity
-gcoldcapacity
PGCMN 持久代最小空間容量,單位KB。 -gccapacity
-gcpermcapacity
PGCMX 持久代最大空間容量,單位KB。 -gccapacity
-gcpermcapacity
PGC 持久代當前空間容量,單位KB。 -gccapacity
-gcpermcapacity
PC 持久代當前空間大小,單位KB -gccapacity
-gcpermcapacity
PU 持久代當前已用空間大小,單位KB -gc
-gcold
LGCC 最後一次GC發生的原因 -gccause
GCC 當前GC發生的原因 -gccause
TT 老年化閾值。被移動到老年代之前,在新生代空存活的次數。 -gcnew
MTT 最大老年化閾值。被移動到老年代之前,在新生代空存活的次數。 -gcnew
DSS Adequate size of survivor in KB
倖存者區所需空間大小,單位KB。
-gcnew

參考文章:http://www.importnew.com/2057.html

下面內容,摘自:http://jameswxx.javaeye.com/blog/731763

在本機執行 jstat -gcutil 340 10000,這個命令是每個10秒鐘輸出一次jvm的gc資訊,10000指的是間隔時間為10000毫秒。螢幕上顯示如下資訊(我只取了第一行,因為是按的一定頻率顯示,所以實際執行的時候,會有很多行):

S0 S1 E O P YGC YGCT FGC FGCT GCT
54.62 0.00 42.87 43.52 86.24 1792 5.093 33 7.670 12.763

如果young gc和full gc能夠正常發生,而且都能有效回收記憶體,常駐記憶體區變化不明顯,則說明java記憶體釋放情況正常,垃圾回收及時,java記憶體洩露的機率就會大大降低。但也不能說明一定沒有記憶體洩露。

每次young gc消耗的時間,可以用相間隔的兩行YGCT相減得到。每次full gc消耗的時間,可以用相隔的兩行FGCT相減得到

官方文件的一個例子:

Using the gcutil option

This example attaches to lvmid 21891 and takes 7 samples at 250 millisecond intervals and displays the output as specified by the -gcutil option.

jstat -gcutil 21891 250 7
  S0     S1     E      O      P     YGC    YGCT    FGC    FGCT     GCT
 12.44   0.00  27.20   9.49  96.70    78    0.176     5    0.495    0.672
 12.44   0.00  62.16   9.49  96.70    78    0.176     5    0.495    0.672
 12.44   0.00  83.97   9.49  96.70    78    0.176     5    0.495    0.672
  0.00   7.74   0.00   9.51  96.70    79    0.177     5    0.495    0.673
  0.00   7.74  23.37   9.51  96.70    79    0.177     5    0.495    0.673
  0.00   7.74  43.82   9.51  96.70    79    0.177     5    0.495    0.673
  0.00   7.74  58.11   9.51  96.71    79    0.177     5    0.495    0.673
The output of this example shows that a young generation collection occurred between the 3rd and 4th sample. The collection took 0.001 seconds and promoted objects from the eden space (E) to the old space (O), resulting in an increase of old space utilization from 9.49% to 9.51%. Before the collection, the survivor space was 12.44% utilized, but after this collection it is only 7.74% utilized.