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次),輸出內容,含義如下:
|
||||||||||
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
- S0:新生代的susvivor0區,空間使用率爲54..62%
- S1:新生代的susvivor1區,空間使用率爲0.00%(因爲還沒有執行第二次minor收集)
- E:eden區,空間使用率42.87%
- O:舊生代,空間使用率43.52%
- P:持久帶,空間使用率86.24%
- YGC:minor gc執行次數1792次
- YGCT:minor gc耗費的時間5.093毫秒
- FGC:full gc執行次數33
- FGCT:full gc耗費的時間7.670毫秒
- GCT:gc耗費的總時間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 a