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 -class pid 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

[xhtml] view plaincopy
  1. S0:新生代的susvivor0區,空間使用率爲54..62%  
  2. S1:新生代的susvivor1區,空間使用率爲0.00%(因爲還沒有執行第二次minor收集)  
  3. E:eden區,空間使用率42.87%  
  4. O:舊生代,空間使用率43.52%  
  5. P:持久帶,空間使用率86.24%  
  6. YGC:minor gc執行次數1792次  
  7. YGCT:minor gc耗費的時間5.093毫秒  
  8. FGC:full gc執行次數33  
  9. FGCT:full gc耗費的時間7.670毫秒  
  10. GCT:gc耗費的總時間12.763毫秒   

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

 

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

官方文檔的一個例子:

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. Using the gcutil option  
  2.   
  3. This example attaches to lvmid 21891 and takes 7 samples at 250 millisecond intervals and displays the output as specified by the -gcutil option.  
  4.   
  5. jstat -gcutil 21891 250 7  
  6.   S0     S1     E      O      P     YGC    YGCT    FGC    FGCT     GCT  
  7.  12.44   0.00  27.20   9.49  96.70    78    0.176     5    0.495    0.672  
  8.  12.44   0.00  62.16   9.49  96.70    78    0.176     5    0.495    0.672  
  9.  12.44   0.00  83.97   9.49  96.70    78    0.176     5    0.495    0.672  
  10.   0.00   7.74   0.00   9.51  96.70    79    0.177     5    0.495    0.673  
  11.   0.00   7.74  23.37   9.51  96.70    79    0.177     5    0.495    0.673  
  12.   0.00   7.74  43.82   9.51  96.70    79    0.177     5    0.495    0.673  
  13.   0.00   7.74  58.11   9.51  96.71    79    0.177     5    0.495    0.673  
  14. The output of this example shows that a young generation collection occurred between the 3rd a
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章