JVM性能監(jiān)控-命令行工具

使用適當(dāng)?shù)奶摂M機(jī)監(jiān)控和分析工具可以加快我們分析數(shù)據(jù)、定位解決問題的速度打洼。
這些命令行工具大多是jdk/lib/tools.jar類庫(kù)的一層薄包裝龄糊,主要的功能代碼是在tools類庫(kù)中實(shí)現(xiàn)的,如圖一募疮。


圖一

jps:虛擬機(jī)進(jìn)程狀況工具

JVM Process Status Tool炫惩,顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機(jī)進(jìn)程

jps命令格式:

jps [ options ] [ hostid ]

執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jps -l
5256 /opt/CalculateScore/CalculateScore.jar
17766 sun.tools.jps.Jps

option參數(shù):

選項(xiàng) 作用
-q 只輸出LVMID,省略主類的名稱
-m 輸出虛擬機(jī)進(jìn)程啟動(dòng)時(shí)傳遞給主類main()函數(shù)的參數(shù)
-l 輸出主類的全名阿浓,如果進(jìn)程執(zhí)行的是jar包他嚷,輸出Jar路徑
-v 輸出虛擬機(jī)進(jìn)程啟動(dòng)時(shí)的JVM參數(shù)

jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具

JVM Statistics Monitoring Tool,用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息的命令行工具芭毙。它可以顯示出虛擬機(jī)進(jìn)程中的類裝載筋蓖、內(nèi)存、垃圾收集退敦、JIT(Just In Time)即時(shí)編譯等運(yùn)行數(shù)據(jù)粘咖。

jstat命令格式:

jstat [ option lvmid [ interval[s|ms] [count] ] ]

option參數(shù):

選項(xiàng) 作用
-class class loader的行為統(tǒng)計(jì)。監(jiān)視類裝載侈百、卸載數(shù)量瓮下、總空間以及類裝載所耗費(fèi)的時(shí)間
-gc 垃圾回收堆的行為統(tǒng)計(jì)。監(jiān)視Java堆狀況钝域,包括Eden區(qū)讽坏、兩個(gè)Survivor區(qū)、老年代网梢、永久代等的容量震缭、已用空間、GC時(shí)間合計(jì)等信息
-gccapacity 監(jiān)視內(nèi)容與-gc基本相同战虏,但輸出主要關(guān)注java堆各個(gè)區(qū)域(young,old,perm)使用到的最大拣宰、最小空間
-gcutil 監(jiān)視內(nèi)容與-gc基本相同党涕,但輸出主要關(guān)注已使用空間占總空間的百分比
-gccause 與-gcutil功能一樣,但是會(huì)額外輸出導(dǎo)致上一次GC的原因
-gcnew 新生代行為統(tǒng)計(jì)巡社。監(jiān)視新生代GC狀況
-gcnewcapacity 監(jiān)視內(nèi)容與-gcnew基本相同膛堤,輸出主要關(guān)注使用到的最大、最小空間
-gcold 年老代和永生代行為統(tǒng)計(jì)晌该。監(jiān)視老年代和永久代GC狀況
-gcoldcapacity 年老代行為統(tǒng)計(jì)肥荔。輸出主要關(guān)注使用到的最大、最小空間
-gcpermcapacity 永生代行為統(tǒng)計(jì)朝群。輸出主要關(guān)注使用到的最大燕耿、最小空間
-compiler HotSpt JIT編譯器行為統(tǒng)計(jì)。輸出JIT編譯器編譯過的方法姜胖、耗時(shí)等信息
-printcompilation HotSpot編譯方法統(tǒng)計(jì)誉帅。輸出已經(jīng)被JIT編譯的方法

option參數(shù)詳解:

-class
監(jiān)視類裝載、卸載數(shù)量右莱、總空間以及類裝載所耗費(fèi)的時(shí)間
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jstat -class 5256 500 3
Loaded  Bytes  Unloaded  Bytes     Time   
 7280 15178.8       81   132.2       5.16
 7280 15178.8       81   132.2       5.16
 7280 15178.8       81   132.2       5.16

Loaded:加載的class數(shù)量
Bytes:加載的class字節(jié)大小
Unloaded:未加載的class數(shù)量
Bytes:未加載的class字節(jié)大小
Time:加載時(shí)間


-gc
監(jiān)視Java堆狀況蚜锨,包括Eden區(qū)、兩個(gè)Survivor區(qū)慢蜓、老年代亚再、永久代等的容量、已用空間晨抡、GC時(shí)間合計(jì)等信息
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jstat -gc 20955
S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     
PU    YGC     YGCT    FGC    FGCT     GCT   
384.0  448.0   0.0   416.0   9408.0   5963.6   62272.0    60694.8   
56960.0 56669.3  10337   37.052  55     10.115   47.167

C即Capacity 總?cè)萘糠招琔即Used 已使用的容量

S0C:survivor0區(qū)的總?cè)萘?br> S1C:survivor1區(qū)的總?cè)萘?br> S0U:survivor0區(qū)已使用的容量
S1U:survivor1區(qū)已使用的容量
EC:Eden區(qū)的總?cè)萘?br> EU:Eden區(qū)已使用的容量
OC:Old區(qū)的總?cè)萘?br> OU:Old區(qū)已使用的容量
PC:當(dāng)前perm的容量 (KB)
PU:perm的使用 (KB)
YGC:新生代垃圾回收次數(shù)
YGCT:新生代垃圾回收時(shí)間
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時(shí)間
GCT:垃圾回收總消耗時(shí)間


-gccapacity
監(jiān)視內(nèi)容與-gc基本相同,但輸出主要關(guān)注java堆各個(gè)區(qū)域(young,old,perm)使用到的最大凄诞、最小空間
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jstat -gccapacity 20955
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      
 OGCMX       OGC         OC      PGCMN    PGCMX     PGC       
 PC    YGC    FGC 
 21120.0 338560.0  18240.0  896.0  896.0  16320.0    42304.0  
 677248.0    66944.0    66944.0  21248.0  83968.0  56960.0  
 56960.0  10803    60

NGCMN : 新生代占用的最小空間
NGCMX : 新生代占用的最大空間
NGC : 當(dāng)前新生代的容量
S0C:當(dāng)前survivor0區(qū)的空間
S1C:當(dāng)前survivor1區(qū)的空間
EC:當(dāng)前Eden區(qū)的空間
OGCMN : 老年代占用的最小空間
OGCMX : 老年代占用的最大空間
OGC:當(dāng)前年老代的容量 (KB)
OC:當(dāng)前年老代的空間 (KB)
PGCMN : perm占用的最小空間
PGCMX : perm占用的最大空間
PGC : 當(dāng)前perm區(qū)的容量
PC : 當(dāng)前perm區(qū)的空間
YGC:新生代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)


-gcutil
監(jiān)視內(nèi)容與-gc基本相同圆雁,但輸出主要關(guān)注已使用空間占總空間的百分比
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jstat -gcutil 20955
 S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     
 GCT   
 0.00  64.48  57.31  78.34  99.46  11105   39.882    61   11.202   
 51.084

S0:survivor0區(qū)占用百分比
S1:survivor1區(qū)占用百分比
E:Eden區(qū)占用百分比
O : 年老代占用百分比
P : 永久代占用百分比
YGC:新生代垃圾回收次數(shù)
YGCT:新生代垃圾回收時(shí)間
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時(shí)間
GCT:垃圾回收總消耗時(shí)間


-gccause
與-gcutil功能一樣,但是會(huì)額外輸出導(dǎo)致上一次GC的原因
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jstat -gccause 20955
S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT        
LGCC                 GCC                 
0.00  58.82  12.34  79.37  99.49  11125   39.959    61   11.202   
51.161 unknown GCCause      No GC 

S0:survivor0區(qū)占用百分比
S1:survivor1區(qū)占用百分比
E:Eden區(qū)占用百分比
O : 年老代占用百分比
P : 永久代占用百分比
YGC:新生代垃圾回收次數(shù)
YGCT:新生代垃圾回收時(shí)間
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時(shí)間
GCT:垃圾回收總消耗時(shí)間
LGCC:最近垃圾回收的原因
GCC:當(dāng)前垃圾回收的原因


-gcnew
監(jiān)視新生代GC狀況
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jstat -gcnew 20955
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC         
 YGCT  
 1152.0 1152.0    0.0  696.0 15  15 1152.0  69760.0  47539.3  
 11135   40.002

S0C:survivor0區(qū)的總?cè)萘?br> S1C:survivor1區(qū)的總?cè)萘?br> S0U:survivor0區(qū)已使用的容量
S1U:survivor1區(qū)已使用的容量
TT:Tenuring threshold(晉升老年代的內(nèi)存閾值)
MTT:最大的tenuring threshold(晉升老年代的年齡閾值)
DSS:survivor區(qū)域大小 (KB)
EC:Eden區(qū)的總?cè)萘?br> EU:Eden區(qū)已使用的容量
YGC:新生代垃圾回收次數(shù)
YGCT:新生代垃圾回收時(shí)間


-gcnewcapacity
監(jiān)視內(nèi)容與-gcnew基本相同帆谍,輸出主要關(guān)注使用到的最大、最小空間
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jstat -gcnewcapacity 20955
 NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     
 S1C       ECMX        EC      YGC   FGC 
 21120.0   338560.0    73536.0    960.0 112832.0 112832.0   
 1088.0   338432.0    71296.0 11160    61

NGCMN : 新生代占用的最小空間
NGCMX : 新生代占用的最大空間
NGC : 當(dāng)前新生代的容量
S0CMX : survivor0區(qū)占用的最大空間
S0C:當(dāng)前survivor0區(qū)的空間
S1CMX : survivor1區(qū)占用的最大空間
S1C:當(dāng)前survivor1區(qū)的空間
ECMX : Eden區(qū)占用的最大空間
EC:當(dāng)前Eden區(qū)的空間
YGC:新生代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)


-gcold
監(jiān)視老年代和永久代GC狀況
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jstat -gcold 20955
PC       PU        OC          OU       YGC    FGC    FGCT     GCT   
56960.0  56669.6     64512.0     53414.0  11173    61   11.202   
51.383

PC:當(dāng)前perm的容量 (KB)
PU:perm的使用 (KB)
OC:Old區(qū)的總?cè)萘?br> OU:Old區(qū)已使用的容量
YGC:新生代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時(shí)間
GCT:垃圾回收總消耗時(shí)間


-gcoldcapacity
輸出主要關(guān)注使用到的最大轴咱、最小空間
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jstat -gcoldcapacity 20955
OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     
GCT   
42304.0    677248.0     64512.0     64512.0 11185    61   11.202   
51.440

OGCMN : 老年代占用的最小空間
OGCMX : 老年代占用的最大空間
OGC:當(dāng)前年老代的容量 (KB)
OC:當(dāng)前年老代的空間 (KB)
YGC:新生代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時(shí)間
GCT:垃圾回收總消耗時(shí)間


-gcpermcapacity
永生代行為統(tǒng)計(jì)汛蝙。輸出主要關(guān)注使用到的最大、最小空間
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]#jstat -gcpermcapacity 28920
 PGCMN      PGCMX       PGC         PC      YGC   FGC    FGCT     
 GCT   
 1048576.0  2097152.0  1048576.0  1048576.0     4     0    0.000    
 0.242

PGCMN : 永久代占用的最小空間
PGCMX : 永久代占用的最大空間
PGC:當(dāng)前永久代的容量 (KB)
PC:當(dāng)前永久的空間 (KB)
YGC:新生代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時(shí)間
GCT:垃圾回收總消耗時(shí)間


-compiler
HotSpt JIT編譯器行為統(tǒng)計(jì)朴肺。輸出JIT編譯器編譯過的方法窖剑、耗時(shí)等信息
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jstat -compiler 20955
 Compiled Failed Invalid   Time   FailedType FailedMethod
 2847      0       0    36.17          0

Compiled : 編譯數(shù)量
Failed : 編譯失敗數(shù)量
Invalid : 無效數(shù)量
Time : 編譯耗時(shí)
FailedType : 失敗類型
FailedMethod : 失敗方法的全限定名


-printcompilation
HotSpot編譯方法統(tǒng)計(jì)。輸出已經(jīng)被JIT編譯的方法
執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jstat -printcompilation 20955
 Compiled  Size  Type Method
  2848   2373    1 java/util/Arrays mergeSort

Compiled:被執(zhí)行的編譯任務(wù)的數(shù)量
Size:方法字節(jié)碼的字節(jié)數(shù)
Type:編譯類型
Method:編譯方法的類名和方法名戈稿。類名使用”/” 代替 “.” 作為空間分隔符. 方法名是給出類的方法名. 格式是與- XX:+PrintComplation選項(xiàng)一致

jinfo:Java配置信息工具

Configuration Info for Java西土,顯示虛擬機(jī)配置信息,實(shí)時(shí)查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)鞍盗。 jps命令的-v選項(xiàng)可以查看虛擬機(jī)啟動(dòng)時(shí)顯示指定的參數(shù)需了,如果想要查看未被顯示指定的參數(shù)的系統(tǒng)默認(rèn)值就要使用jinfo命令的-flag選項(xiàng)進(jìn)行查詢了跳昼。

jinfo命令格式:

jinfo [ option ] [ args ] lvmid

執(zhí)行樣例:

[root@miaomiao-calculatescore ~]# jinfo -flag CMSInitiatingOccupancyFraction 20955
 -XX:CMSInitiatingOccupancyFraction=-1

option參數(shù):

-flag : 輸出指定args參數(shù)的值
-flags : 不需要args參數(shù),輸出所有JVM參數(shù)的值
-sysprops : 輸出系統(tǒng)屬性肋乍,等同于System.getProperties()

jmap:Java內(nèi)存影像工具

Memory Map for Java鹅颊,生成堆轉(zhuǎn)儲(chǔ)快照(一般稱為heapdump或dump文件)。 jmap的作用不僅僅是為了獲取dump文件墓造,還可以查詢finalize執(zhí)行隊(duì)列堪伍、Java堆和永久代的詳細(xì)信息,如空間使用率觅闽、當(dāng)前使用的是哪種收集器等帝雇。

jmap命令格式:

jmap [ option ] lvmid

option參數(shù):

選項(xiàng) 作用
-dump 生成Java堆轉(zhuǎn)儲(chǔ)快照。格式為:-dump:[live, ]format=b,file=<filename>其中l(wèi)ive子參數(shù)說明是否只dump出存活的對(duì)象
-finalizerinfo 顯示在F-Queue隊(duì)列中等待Finalizer線程執(zhí)行finalize方法的對(duì)象
-heap 顯示Java堆詳細(xì)信息蛉拙。如使用哪種垃圾收集器摊求、參數(shù)配置、分代狀況等
-histo 顯示堆中對(duì)象的統(tǒng)計(jì)信息刘离,包括類室叉、實(shí)例數(shù)量、合計(jì)容器
-permstat 以ClassLoader為統(tǒng)計(jì)口徑顯示永久代內(nèi)存狀態(tài)
-F 當(dāng)虛擬機(jī)進(jìn)程對(duì)-dump沒有響應(yīng)時(shí)硫惕,可使用此選項(xiàng)強(qiáng)制生成dump快照

option參數(shù)詳解:

-dump
生成Java堆轉(zhuǎn)儲(chǔ)快照茧痕。格式為:-dump:[live, ]format=b,file=<filename> live指明是否只dump出存活的對(duì)象,format指定輸出格式,file指定文件名

執(zhí)行樣例:

[root@miaomiao-calculatescore CalculateScore]# jmap -F -dump:live,format=b,file=dump.hprof 20995
 Attaching to process ID 20995, please wait...
 Debugger attached successfully.
 Server compiler detected.
 JVM version is 20.45-b01
 Dumping heap to dump.hprof ...

dump.hprof這個(gè)后綴是為了后續(xù)可以直接用MAT(Memory Anlysis Tool)打開恼除。


-finalizerinfo
顯示在F-Queue隊(duì)列中等待Finalizer線程執(zhí)行finalize方法的對(duì)象

執(zhí)行樣例:

[root@miaomiao-calculatescore CalculateScore]# jmap -finalizerinfo 20995
 Attaching to process ID 28920, please wait...
 Debugger attached successfully.
 Server compiler detected.
 JVM version is 24.71-b01
 Number of objects pending for finalization: 0

可以看到當(dāng)前F-Queue隊(duì)列中并沒有等待Finalizer線程執(zhí)行finalize方法的對(duì)象踪旷。


-heap
顯示Java堆詳細(xì)信息。如使用哪種垃圾收集器豁辉、參數(shù)配置令野、分代狀況等

執(zhí)行樣例:

[root@miaomiao-calculatescore CalculateScore]# jmap -heap 17986
 Attaching to process ID 17986, please wait...
 Debugger attached successfully.
 Server compiler detected.
 JVM version is 20.45-b01

 using thread-local object allocation.
 Parallel GC with 2 thread(s) //GC收集器

 Heap Configuration: //堆內(nèi)存初始化配置
   MinHeapFreeRatio = 40 //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MinHeapFreeRatio設(shè)置JVM堆最小空閑比率(default 40)
   MaxHeapFreeRatio = 70 //對(duì)應(yīng)jvm啟動(dòng)參數(shù) -XX:MaxHeapFreeRatio設(shè)置JVM堆最大空閑比率(default 70)
   MaxHeapSize      = 1040187392 (992.0MB) //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxHeapSize設(shè)置JVM堆的最大大小
   NewSize          = 1310720 (1.25MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:NewSize設(shè)置JVM堆的新生代的默認(rèn)大小
   MaxNewSize       = 17592186044415 MB//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxNewSize設(shè)置JVM堆的新生代的最大大小
   OldSize          = 5439488 (5.1875MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:OldSize設(shè)置JVM堆的老生代的大小
   NewRatio         = 2 //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:NewRatio設(shè)置新生代和老生代的大小比率
   SurvivorRatio    = 8 //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:SurvivorRatio設(shè)置新生代中Eden區(qū)與Survivor區(qū)的大小比值 
   PermSize         = 21757952 (20.75MB) //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:PermSize設(shè)置JVM堆的永久代的初始大小
   MaxPermSize      = 85983232 (82.0MB) //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxPermSize設(shè)置JVM堆的永久代的最大大小

 Heap Usage: //堆內(nèi)存使用情況
 PS Young Generation
 Eden Space: //Eden區(qū)內(nèi)存分布
   capacity = 130023424 (124.0MB) //Eden區(qū)總?cè)萘?   used     = 37682272 (35.936614990234375MB)  //Eden區(qū)已使用
   free     = 92341152 (88.06338500976562MB) //Eden區(qū)剩余容量
   28.981141121156753% used //Eden區(qū)使用比率
 From Space: //Survivor0區(qū)的內(nèi)存分布
   capacity = 786432 (0.75MB)
   used     = 720928 (0.687530517578125MB)
   free     = 65504 (0.062469482421875MB)
   91.67073567708333% used
 To Space: //Survivor1區(qū)的內(nèi)存分布
   capacity = 6422528 (6.125MB)
   used     = 0 (0.0MB)
   free     = 6422528 (6.125MB)
   0.0% used
 PS Old Generation //當(dāng)前的Old區(qū)內(nèi)存分布
   capacity = 43319296 (41.3125MB)
   used     = 20436424 (19.48969268798828MB)
   free     = 22882872 (21.82280731201172MB)
   47.176260666840015% used
 PS Perm Generation //當(dāng)前的永久代內(nèi)存分布
   capacity = 56164352 (53.5625MB)
   used     = 56004904 (53.410438537597656MB)
   free     = 159448 (0.15206146240234375MB)
   99.71610462095245% used

可以很清楚的看到Java堆中各個(gè)區(qū)域目前的情況。


-histo
顯示堆中對(duì)象的統(tǒng)計(jì)信息徽级,包括類气破、實(shí)例數(shù)量、合計(jì)容器餐抢。(因?yàn)樵赿ump:live前會(huì)進(jìn)行full gc现使,如果帶上live則只統(tǒng)計(jì)活對(duì)象,因此不加live的堆大小要大于加live堆的大小 )

執(zhí)行樣例:

[root@miaomiao-calculatescore CalculateScore]# jmap -histo:live 17986 | more

 num     #instances         #bytes  class name
 ----------------------------------------------
 1:         84343       12060272  <constMethodKlass>
 2:         84343       11481208  <methodKlass>
 3:         18176        8998776  [B
 4:          7130        8247248  <constantPoolKlass>
 5:        115421        6567664  <symbolKlass>
 6:          7130        5664136  <instanceKlassKlass>
 7:          5920        4854144  <constantPoolCacheKlass>
 8:         42489        3981136  [C
 9:         13065        1855784  [I
10:         52831        1690592  java.util.HashMap$Entry
--More--

class name是對(duì)象類型旷痕,說明如下:

B byte
C char
D double
F float
I int
J long
Z boolean
[ 數(shù)組碳锈,如[I表示int[]
[L+類名 其他對(duì)象


-permstat
以ClassLoader為統(tǒng)計(jì)口徑顯示永久代內(nèi)存狀態(tài)。對(duì)于每個(gè)類加載器而言欺抗,它的名稱售碳、活躍度、地址、父類加載器贸人、它所加載的類的數(shù)量和大小都會(huì)顯示间景。此外,包含的字符串?dāng)?shù)量和大小也會(huì)顯示。

執(zhí)行樣例:

[root@miaomiao-calculatescore CalculateScore]# jmap -permstat 17986 |more
 Attaching to process ID 17986, please wait...
 Debugger attached successfully.
 Server compiler detected.
 JVM version is 20.45-b01
 finding class loader instances ..16401 intern Strings occupying 
 1810240 bytes.
 Finding object size using Printezis bits and skipping over...
 Finding object size using Printezis bits and skipping over...
 Finding object size using Printezis bits and skipping over...
 done.
 computing per loader stat ..done.
 please wait.. computing liveness...........................liveness analysis may be inaccurate ...
 class_loader   classes bytes   parent_loader   alive?  type

 <bootstrap>    1938    11332152      null      live    <internal>
 0x00000000c2bdb1b8 1   3176    0x00000000c2112748  dead    sun/reflect/DelegatingClassLoader@0x00000000bce67830
 0x00000000c2c74c40 1   3120    0x00000000c2112748  dead    sun/reflect/DelegatingClassLoader@0x00000000bce67830
 --More--

-F
強(qiáng)制模式。如果指定的lvmid沒有響應(yīng)腾仅,請(qǐng)使用jmap -F -dump或jmap -F -histo選項(xiàng)。此模式下碗誉,不支持live子選項(xiàng)。

jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具

JVM Heap Analysis Tool父晶,與jmap搭配使用哮缺,用來分析jmap生成的heapdump文件,它會(huì)建立一個(gè)HTTP/HTML服務(wù)器甲喝,讓用戶可以在瀏覽器上查看分析結(jié)果尝苇。在實(shí)際工作中,一般不會(huì)直接使用jhat命令分析dump文件行埠胖,因?yàn)榉治龉ぷ魇且粋€(gè)耗時(shí)而且耗費(fèi)硬件資源的過程糠溜,另一個(gè)原因是jhat的分析功能相對(duì)于專業(yè)的分析工具(VisualVM、IBM HeapAnalyzer等)比較簡(jiǎn)陋直撤。

jhat命令格式:

jhat [ option ] [ heapdumpfile ]

執(zhí)行樣例:

[root@miaomiao-calculatescore CalculateScore]# jhat -J-Xmx256M dump.hprof
 Reading from dump.hprof...
 Dump file created Sun Mar 25 11:20:43 CST 2018
 Snapshot read, resolving...
 Resolving 593966 objects...
 Chasing references, expect 118 dots..........................
 Eliminating duplicate references.............................
 Snapshot resolved.
 Started HTTP server on port 7000
 Server is ready.

-J-Xmx256M是在dump快照很大的情況下分配內(nèi)存去啟動(dòng)HTTP服務(wù)器非竿,運(yùn)行完之后就可在瀏覽器打開Http://localhost:7000進(jìn)行快照分析。堆快照分析主要在最后面的Heap Histogram里谋竖,里面根據(jù)class列出了dump的時(shí)候所有存活對(duì)象红柱。

分析:
打開瀏覽器Http://localhost:7000,該頁(yè)面提供了幾個(gè)查詢功能可供使用蓖乘。如圖二:

圖二

一般查看堆異常情況主要看這個(gè)兩個(gè)部分:
Show instance counts for all classes (excluding platform)锤悄,平臺(tái)外的所有對(duì)象信息。如圖三:


圖三

Show heap histogram 以樹狀圖形式展示堆情況嘉抒。如圖四:


圖四

具體排查時(shí)需要結(jié)合代碼零聚,看是否存在大量應(yīng)該被回收的對(duì)象一直被引用或者是否有占用內(nèi)存特別大的對(duì)象無法被回收。

通常情況下众眨,是將dump文件down下來握牧,通過專業(yè)的工具(VisualVM、IBM HeapAnalyzer等)來進(jìn)行分析娩梨。

option參數(shù):

選項(xiàng) 作用
-stack false、true 關(guān)閉對(duì)象分配調(diào)用棧跟蹤览徒。 如果分配位置信息在堆轉(zhuǎn)儲(chǔ)中不可用狈定,則必須將此標(biāo)志設(shè)置為 false。默認(rèn)值為 true。
-refs false纽什、true 關(guān)閉對(duì)象引用跟蹤措嵌。默認(rèn)值為 true。默認(rèn)情況下, 返回的指針是指向其他特定對(duì)象的對(duì)象芦缰,如反向鏈接或輸入引用企巢,會(huì)統(tǒng)計(jì)/計(jì)算堆中的所有對(duì)象。
-port port-number 設(shè)置 jhat HTTP server 的端口號(hào)让蕾。默認(rèn)值 7000
-exclude exclude-file 指定對(duì)象查詢時(shí)需要排除的數(shù)據(jù)成員列表文件浪规。 例如,如果文件列出了 java.lang.String.value探孝,那么當(dāng)從某個(gè)特定對(duì)象 Object o 計(jì)算可達(dá)的對(duì)象列表時(shí)笋婿,引用路徑涉及 java.lang.String.value 的都會(huì)被排除。
-baseline exclude-file 指定一個(gè)基準(zhǔn)堆轉(zhuǎn)儲(chǔ)(baseline heap dump)顿颅。 在兩個(gè) heap dumps 中有相同 object ID 的對(duì)象會(huì)被標(biāo)記為不是新的缸濒。其他對(duì)象被標(biāo)記為新的(new)。在比較兩個(gè)不同的堆轉(zhuǎn)儲(chǔ)時(shí)很有用粱腻。
-debug int 設(shè)置 debug 級(jí)別庇配。0 表示不輸出調(diào)試信息。 值越大則表示輸出更詳細(xì)的 debug 信息绍些。
-version 啟動(dòng)后只顯示版本信息就退出捞慌。
-J < flag > 因?yàn)?jhat 命令實(shí)際上會(huì)啟動(dòng)一個(gè)JVM來執(zhí)行,通過 -J 可以在啟動(dòng)JVM時(shí)傳入一些啟動(dòng)參數(shù)遇革。例如卿闹, -J-Xmx512M 則指定運(yùn)行 jhat 的Java虛擬機(jī)使用的最大堆內(nèi)存為 512M。如果需要使用多個(gè)JVM啟動(dòng)參數(shù)萝快,則傳入多個(gè) -Jxxxxxx锻霎。

jstack:Java堆棧跟蹤工具

Stack Trace for Java,顯示虛擬機(jī)的線程快照揪漩。線程快照是當(dāng)前虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合旋恼,生成線程快照的主要目的是定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因,如線程間死鎖奄容、死循環(huán)冰更、請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間等待等。 線程出現(xiàn)停頓的時(shí)候通過jstack來查看各個(gè)線程的調(diào)用堆棧昂勒,就可以知道沒有響應(yīng)的線程到底在后臺(tái)做什么事情蜀细,或者等待什么資源。

jstack命令格式:

jstack [ option ] lvmid

執(zhí)行樣例:

[root@miaomiao-calculatescore CalculateScore]# jstack -l 17986|more
 2018-03-25 15:18:23
 Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.45-b01 mixed mode):

 "hconnection-0x74bfed5a-shared--pool1-t11268" daemon prio=10 tid=0x0000000040f88000 nid=0xc42 waiting on condition
 [0x00007fe1c5642000]
  java.lang.Thread.State: TIMED_WAITING (parking)
   at sun.misc.Unsafe.park(Native Method)
   - parking to wait for  <0x00000000c228a1c8> (a 
  java.util.concurrent.locks.AbstractQueuedSynchronizer$Condi 
  tionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java
  :196)  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionO
   bject.awaitNanos(AbstractQueuedSynchron
   izer.java:2025)
   at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424)
   at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:955)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:917)
   at java.lang.Thread.run(Thread.java:662)

  Locked ownable synchronizers:
  - None

option參數(shù):

-F : 當(dāng)正常輸出請(qǐng)求不被響應(yīng)時(shí)戈盈,強(qiáng)制輸出線程堆棧
-l : 除堆棧外奠衔,顯示關(guān)于鎖的附加信息
-m : 如果調(diào)用到本地方法的話谆刨,可以顯示C/C++的堆棧

參考
[深入理解Java虛擬機(jī)]
jvm系列(四):jvm調(diào)優(yōu)-命令篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市归斤,隨后出現(xiàn)的幾起案子痊夭,更是在濱河造成了極大的恐慌,老刑警劉巖脏里,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件她我,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡迫横,警方通過查閱死者的電腦和手機(jī)番舆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來员淫,“玉大人合蔽,你說我怎么就攤上這事〗榉担” “怎么了拴事?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)圣蝎。 經(jīng)常有香客問我刃宵,道長(zhǎng),這世上最難降的妖魔是什么徘公? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任牲证,我火速辦了婚禮,結(jié)果婚禮上关面,老公的妹妹穿的比我還像新娘坦袍。我一直安慰自己,他們只是感情好等太,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布捂齐。 她就那樣靜靜地躺著,像睡著了一般缩抡。 火紅的嫁衣襯著肌膚如雪奠宜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天瞻想,我揣著相機(jī)與錄音压真,去河邊找鬼。 笑死蘑险,一個(gè)胖子當(dāng)著我的面吹牛滴肿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播佃迄,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼嘴高,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼竿音!你這毒婦竟也來了和屎?” 一聲冷哼從身側(cè)響起拴驮,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柴信,沒想到半個(gè)月后套啤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡随常,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年潜沦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绪氛。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唆鸡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枣察,到底是詐尸還是另有隱情争占,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布序目,位于F島的核電站臂痕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏猿涨。R本人自食惡果不足惜握童,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叛赚。 院中可真熱鬧澡绩,春花似錦、人聲如沸俺附。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昙读。三九已至召调,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛮浑,已是汗流浹背唠叛。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沮稚,地道東北人艺沼。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蕴掏,于是被迫代替她去往敵國(guó)和親障般。 傳聞我的和親對(duì)象是個(gè)殘疾皇子调鲸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 原文閱讀 前言 這段時(shí)間懈怠了,罪過挽荡! 最近看到有同事也開始用上了微信公眾號(hào)寫博客了藐石,挺好的~給他們點(diǎn)贊,這博客我...
    碼農(nóng)戲碼閱讀 5,994評(píng)論 2 31
  • 參數(shù)設(shè)置 在Java虛擬機(jī)的參數(shù)中定拟,有3種表示方法用“ps -ef |grep "java"命令于微,可以得到當(dāng)前Ja...
    九問閱讀 9,154評(píng)論 2 52
  • 本文由作者自行翻譯,未經(jīng)作者授權(quán)青自,不得隨意轉(zhuǎn)發(fā)株依。后續(xù)作者會(huì)陸續(xù)發(fā)布一系列關(guān)于JVM內(nèi)存管理的文章,敬請(qǐng)期待延窜。 1恋腕、...
    猿學(xué)堂閱讀 1,358評(píng)論 0 50
  • 1.一些概念 1.1.數(shù)據(jù)類型 Java虛擬機(jī)中,數(shù)據(jù)類型可以分為兩類:基本類型和引用類型逆瑞≤伲基本類型的變量保存原始...
    落落落落大大方方閱讀 4,545評(píng)論 4 86
  • 1、大祭司的木乃伊 木制木乃伊棺來自埃及的盧克索附近呆万,約公元前二四0年左右商源,主人士埃及身份尊貴的大祭司,名字叫霍尼...
    自由的野馬閱讀 812評(píng)論 0 2