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
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次),輸出內容,含義如下:
|
||||||||||
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.