使用適當?shù)奶摂M機監(jiān)控和分析工具可以加快我們分析數(shù)據(jù)、定位解決問題的速度。
這些命令行工具大多是jdk/lib/tools.jar類庫的一層薄包裝,主要的功能代碼是在tools類庫中實現(xiàn)的,如圖一。
jps:虛擬機進程狀況工具
JVM Process Status Tool,顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機進程
jps命令格式:
jps [ options ] [ hostid ]
執(zhí)行樣例:
[root@miaomiao-calculatescore ~]# jps -l
5256 /opt/CalculateScore/CalculateScore.jar
17766 sun.tools.jps.Jps
option參數(shù):
選項 | 作用 |
---|---|
-q | 只輸出LVMID,省略主類的名稱 |
-m | 輸出虛擬機進程啟動時傳遞給主類main()函數(shù)的參數(shù) |
-l | 輸出主類的全名,如果進程執(zhí)行的是jar包,輸出Jar路徑 |
-v | 輸出虛擬機進程啟動時的JVM參數(shù) |
jstat:虛擬機統(tǒng)計信息監(jiān)視工具
JVM Statistics Monitoring Tool,用于監(jiān)視虛擬機各種運行狀態(tài)信息的命令行工具。它可以顯示出虛擬機進程中的類裝載、內(nèi)存、垃圾收集、JIT(Just In Time)即時編譯等運行數(shù)據(jù)。
jstat命令格式:
jstat [ option lvmid [ interval[s|ms] [count] ] ]
option參數(shù):
選項 | 作用 |
---|---|
-class | class loader的行為統(tǒng)計。監(jiān)視類裝載、卸載數(shù)量、總空間以及類裝載所耗費的時間 |
-gc | 垃圾回收堆的行為統(tǒng)計。監(jiān)視Java堆狀況,包括Eden區(qū)、兩個Survivor區(qū)、老年代、永久代等的容量、已用空間、GC時間合計等信息 |
-gccapacity | 監(jiān)視內(nèi)容與-gc基本相同,但輸出主要關注java堆各個區(qū)域(young,old,perm)使用到的最大、最小空間 |
-gcutil | 監(jiān)視內(nèi)容與-gc基本相同,但輸出主要關注已使用空間占總空間的百分比 |
-gccause | 與-gcutil功能一樣,但是會額外輸出導致上一次GC的原因 |
-gcnew | 新生代行為統(tǒng)計。監(jiān)視新生代GC狀況 |
-gcnewcapacity | 監(jiān)視內(nèi)容與-gcnew基本相同,輸出主要關注使用到的最大、最小空間 |
-gcold | 年老代和永生代行為統(tǒng)計。監(jiān)視老年代和永久代GC狀況 |
-gcoldcapacity | 年老代行為統(tǒng)計。輸出主要關注使用到的最大、最小空間 |
-gcpermcapacity | 永生代行為統(tǒng)計。輸出主要關注使用到的最大、最小空間 |
-compiler | HotSpt JIT編譯器行為統(tǒng)計。輸出JIT編譯器編譯過的方法、耗時等信息 |
-printcompilation | HotSpot編譯方法統(tǒng)計。輸出已經(jīng)被JIT編譯的方法 |
option參數(shù)詳解:
-class
監(jiān)視類裝載、卸載數(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:加載時間
-gc
監(jiān)視Java堆狀況,包括Eden區(qū)、兩個Survivor區(qū)、老年代、永久代等的容量、已用空間、GC時間合計等信息
執(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 總容量,U即Used 已使用的容量
S0C:survivor0區(qū)的總容量
S1C:survivor1區(qū)的總容量
S0U:survivor0區(qū)已使用的容量
S1U:survivor1區(qū)已使用的容量
EC:Eden區(qū)的總容量
EU:Eden區(qū)已使用的容量
OC:Old區(qū)的總容量
OU:Old區(qū)已使用的容量
PC:當前perm的容量 (KB)
PU:perm的使用 (KB)
YGC:新生代垃圾回收次數(shù)
YGCT:新生代垃圾回收時間
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間
-gccapacity
監(jiān)視內(nèi)容與-gc基本相同,但輸出主要關注java堆各個區(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 : 當前新生代的容量
S0C:當前survivor0區(qū)的空間
S1C:當前survivor1區(qū)的空間
EC:當前Eden區(qū)的空間
OGCMN : 老年代占用的最小空間
OGCMX : 老年代占用的最大空間
OGC:當前年老代的容量 (KB)
OC:當前年老代的空間 (KB)
PGCMN : perm占用的最小空間
PGCMX : perm占用的最大空間
PGC : 當前perm區(qū)的容量
PC : 當前perm區(qū)的空間
YGC:新生代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
-gcutil
監(jiān)視內(nèi)容與-gc基本相同,但輸出主要關注已使用空間占總空間的百分比
執(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:新生代垃圾回收時間
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間
-gccause
與-gcutil功能一樣,但是會額外輸出導致上一次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:新生代垃圾回收時間
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間
LGCC:最近垃圾回收的原因
GCC:當前垃圾回收的原因
-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ū)的總容量
S1C:survivor1區(qū)的總容量
S0U:survivor0區(qū)已使用的容量
S1U:survivor1區(qū)已使用的容量
TT:Tenuring threshold(晉升老年代的內(nèi)存閾值)
MTT:最大的tenuring threshold(晉升老年代的年齡閾值)
DSS:survivor區(qū)域大小 (KB)
EC:Eden區(qū)的總容量
EU:Eden區(qū)已使用的容量
YGC:新生代垃圾回收次數(shù)
YGCT:新生代垃圾回收時間
-gcnewcapacity
監(jiān)視內(nèi)容與-gcnew基本相同,輸出主要關注使用到的最大、最小空間
執(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 : 當前新生代的容量
S0CMX : survivor0區(qū)占用的最大空間
S0C:當前survivor0區(qū)的空間
S1CMX : survivor1區(qū)占用的最大空間
S1C:當前survivor1區(qū)的空間
ECMX : Eden區(qū)占用的最大空間
EC:當前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:當前perm的容量 (KB)
PU:perm的使用 (KB)
OC:Old區(qū)的總容量
OU:Old區(qū)已使用的容量
YGC:新生代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間
-gcoldcapacity
輸出主要關注使用到的最大、最小空間
執(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:當前年老代的容量 (KB)
OC:當前年老代的空間 (KB)
YGC:新生代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間
-gcpermcapacity
永生代行為統(tǒng)計。輸出主要關注使用到的最大、最小空間
執(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:當前永久代的容量 (KB)
PC:當前永久的空間 (KB)
YGC:新生代垃圾回收次數(shù)
FGC:老年代垃圾回收次數(shù)
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間
-compiler
HotSpt JIT編譯器行為統(tǒng)計。輸出JIT編譯器編譯過的方法、耗時等信息
執(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 : 編譯耗時
FailedType : 失敗類型
FailedMethod : 失敗方法的全限定名
-printcompilation
HotSpot編譯方法統(tǒng)計。輸出已經(jīng)被JIT編譯的方法
執(zhí)行樣例:
[root@miaomiao-calculatescore ~]# jstat -printcompilation 20955
Compiled Size Type Method
2848 2373 1 java/util/Arrays mergeSort
Compiled:被執(zhí)行的編譯任務的數(shù)量
Size:方法字節(jié)碼的字節(jié)數(shù)
Type:編譯類型
Method:編譯方法的類名和方法名。類名使用”/” 代替 “.” 作為空間分隔符. 方法名是給出類的方法名. 格式是與- XX:+PrintComplation選項一致
jinfo:Java配置信息工具
Configuration Info for Java,顯示虛擬機配置信息,實時查看和調(diào)整虛擬機各項參數(shù)。 jps命令的-v選項可以查看虛擬機啟動時顯示指定的參數(shù),如果想要查看未被顯示指定的參數(shù)的系統(tǒng)默認值就要使用jinfo命令的-flag選項進行查詢了。
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,生成堆轉儲快照(一般稱為heapdump或dump文件)。 jmap的作用不僅僅是為了獲取dump文件,還可以查詢finalize執(zhí)行隊列、Java堆和永久代的詳細信息,如空間使用率、當前使用的是哪種收集器等。
jmap命令格式:
jmap [ option ] lvmid
option參數(shù):
選項 | 作用 |
---|---|
-dump | 生成Java堆轉儲快照。格式為:-dump:[live, ]format=b,file=<filename>其中l(wèi)ive子參數(shù)說明是否只dump出存活的對象 |
-finalizerinfo | 顯示在F-Queue隊列中等待Finalizer線程執(zhí)行finalize方法的對象 |
-heap | 顯示Java堆詳細信息。如使用哪種垃圾收集器、參數(shù)配置、分代狀況等 |
-histo | 顯示堆中對象的統(tǒng)計信息,包括類、實例數(shù)量、合計容器 |
-permstat | 以ClassLoader為統(tǒng)計口徑顯示永久代內(nèi)存狀態(tài) |
-F | 當虛擬機進程對-dump沒有響應時,可使用此選項強制生成dump快照 |
option參數(shù)詳解:
-dump
生成Java堆轉儲快照。格式為:-dump:[live, ]format=b,file=<filename> live指明是否只dump出存活的對象,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這個后綴是為了后續(xù)可以直接用MAT(Memory Anlysis Tool)打開。
-finalizerinfo
顯示在F-Queue隊列中等待Finalizer線程執(zhí)行finalize方法的對象
執(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
可以看到當前F-Queue隊列中并沒有等待Finalizer線程執(zhí)行finalize方法的對象。
-heap
顯示Java堆詳細信息。如使用哪種垃圾收集器、參數(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 //對應jvm啟動參數(shù)-XX:MinHeapFreeRatio設置JVM堆最小空閑比率(default 40)
MaxHeapFreeRatio = 70 //對應jvm啟動參數(shù) -XX:MaxHeapFreeRatio設置JVM堆最大空閑比率(default 70)
MaxHeapSize = 1040187392 (992.0MB) //對應jvm啟動參數(shù)-XX:MaxHeapSize設置JVM堆的最大大小
NewSize = 1310720 (1.25MB)//對應jvm啟動參數(shù)-XX:NewSize設置JVM堆的新生代的默認大小
MaxNewSize = 17592186044415 MB//對應jvm啟動參數(shù)-XX:MaxNewSize設置JVM堆的新生代的最大大小
OldSize = 5439488 (5.1875MB)//對應jvm啟動參數(shù)-XX:OldSize設置JVM堆的老生代的大小
NewRatio = 2 //對應jvm啟動參數(shù)-XX:NewRatio設置新生代和老生代的大小比率
SurvivorRatio = 8 //對應jvm啟動參數(shù)-XX:SurvivorRatio設置新生代中Eden區(qū)與Survivor區(qū)的大小比值
PermSize = 21757952 (20.75MB) //對應jvm啟動參數(shù)-XX:PermSize設置JVM堆的永久代的初始大小
MaxPermSize = 85983232 (82.0MB) //對應jvm啟動參數(shù)-XX:MaxPermSize設置JVM堆的永久代的最大大小
Heap Usage: //堆內(nèi)存使用情況
PS Young Generation
Eden Space: //Eden區(qū)內(nèi)存分布
capacity = 130023424 (124.0MB) //Eden區(qū)總容量
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 //當前的Old區(qū)內(nèi)存分布
capacity = 43319296 (41.3125MB)
used = 20436424 (19.48969268798828MB)
free = 22882872 (21.82280731201172MB)
47.176260666840015% used
PS Perm Generation //當前的永久代內(nèi)存分布
capacity = 56164352 (53.5625MB)
used = 56004904 (53.410438537597656MB)
free = 159448 (0.15206146240234375MB)
99.71610462095245% used
可以很清楚的看到Java堆中各個區(qū)域目前的情況。
-histo
顯示堆中對象的統(tǒng)計信息,包括類、實例數(shù)量、合計容器。(因為在dump:live前會進行full gc,如果帶上live則只統(tǒng)計活對象,因此不加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是對象類型,說明如下:
B byte
C char
D double
F float
I int
J long
Z boolean
[ 數(shù)組,如[I表示int[]
[L+類名 其他對象
-permstat
以ClassLoader為統(tǒng)計口徑顯示永久代內(nèi)存狀態(tài)。對于每個類加載器而言,它的名稱、活躍度、地址、父類加載器、它所加載的類的數(shù)量和大小都會顯示。此外,包含的字符串數(shù)量和大小也會顯示。
執(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
強制模式。如果指定的lvmid沒有響應,請使用jmap -F -dump或jmap -F -histo選項。此模式下,不支持live子選項。
jhat:虛擬機堆轉儲快照分析工具
JVM Heap Analysis Tool,與jmap搭配使用,用來分析jmap生成的heapdump文件,它會建立一個HTTP/HTML服務器,讓用戶可以在瀏覽器上查看分析結果。在實際工作中,一般不會直接使用jhat命令分析dump文件行,因為分析工作是一個耗時而且耗費硬件資源的過程,另一個原因是jhat的分析功能相對于專業(yè)的分析工具(VisualVM、IBM HeapAnalyzer等)比較簡陋。
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)存去啟動HTTP服務器,運行完之后就可在瀏覽器打開Http://localhost:7000進行快照分析。堆快照分析主要在最后面的Heap Histogram里,里面根據(jù)class列出了dump的時候所有存活對象。
分析:
打開瀏覽器Http://localhost:7000,該頁面提供了幾個查詢功能可供使用。如圖二:
一般查看堆異常情況主要看這個兩個部分:
Show instance counts for all classes (excluding platform),平臺外的所有對象信息。如圖三:
Show heap histogram 以樹狀圖形式展示堆情況。如圖四:
具體排查時需要結合代碼,看是否存在大量應該被回收的對象一直被引用或者是否有占用內(nèi)存特別大的對象無法被回收。
通常情況下,是將dump文件down下來,通過專業(yè)的工具(VisualVM、IBM HeapAnalyzer等)來進行分析。
option參數(shù):
選項 | 值 | 作用 |
---|---|---|
-stack | false、true | 關閉對象分配調(diào)用棧跟蹤。 如果分配位置信息在堆轉儲中不可用,則必須將此標志設置為 false。默認值為 true。 |
-refs | false、true | 關閉對象引用跟蹤。默認值為 true。默認情況下, 返回的指針是指向其他特定對象的對象,如反向鏈接或輸入引用,會統(tǒng)計/計算堆中的所有對象。 |
-port | port-number | 設置 jhat HTTP server 的端口號。默認值 7000 |
-exclude | exclude-file | 指定對象查詢時需要排除的數(shù)據(jù)成員列表文件。 例如,如果文件列出了 java.lang.String.value,那么當從某個特定對象 Object o 計算可達的對象列表時,引用路徑涉及 java.lang.String.value 的都會被排除。 |
-baseline | exclude-file | 指定一個基準堆轉儲(baseline heap dump)。 在兩個 heap dumps 中有相同 object ID 的對象會被標記為不是新的。其他對象被標記為新的(new)。在比較兩個不同的堆轉儲時很有用。 |
-debug | int | 設置 debug 級別。0 表示不輸出調(diào)試信息。 值越大則表示輸出更詳細的 debug 信息。 |
-version | 啟動后只顯示版本信息就退出。 | |
-J | < flag > | 因為 jhat 命令實際上會啟動一個JVM來執(zhí)行,通過 -J 可以在啟動JVM時傳入一些啟動參數(shù)。例如, -J-Xmx512M 則指定運行 jhat 的Java虛擬機使用的最大堆內(nèi)存為 512M。如果需要使用多個JVM啟動參數(shù),則傳入多個 -Jxxxxxx。 |
jstack:Java堆棧跟蹤工具
Stack Trace for Java,顯示虛擬機的線程快照。線程快照是當前虛擬機內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現(xiàn)長時間停頓的原因,如線程間死鎖、死循環(huán)、請求外部資源導致的長時間等待等。 線程出現(xiàn)停頓的時候通過jstack來查看各個線程的調(diào)用堆棧,就可以知道沒有響應的線程到底在后臺做什么事情,或者等待什么資源。
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 : 當正常輸出請求不被響應時,強制輸出線程堆棧
-l : 除堆棧外,顯示關于鎖的附加信息
-m : 如果調(diào)用到本地方法的話,可以顯示C/C++的堆棧
參考
[深入理解Java虛擬機]
jvm系列(四):jvm調(diào)優(yōu)-命令篇