一般用於tomcat異常場景使用:
OOM, 線程死鎖(lock dead),鎖爭用(lock contention),java消耗過多cpu等
一般使用分析命令有:
jps #查看運行java進程
jstat -gc PID #查看進程PID新生代老年代內存使用情況,年輕老年代垃圾回收次數以及時間
jstat -gccause PID #查看進程垃圾收集原因
jmap -heap PID #查看進程堆內存具體使用情況
jstack -l PID #查看線程信息,用於分析線程爭取,死鎖造成tomcat假死情況
1. jps (JVM Process Status Tool)顯示指定系統所有的HotSpot虛擬機進程
命令格式 | jps [options] [hostid] |
options參數 | 描述 |
-l | 輸出主類全名或jar路徑 |
-p | 只輸出LVMID(本地虛擬機進程ID) |
-m | 輸出JVM啓動時傳遞給main()的參數 |
-v | 輸出jvm啓動時顯示指定的jvm參數 |
2. jstat (JVM statistics Monitoring) 用於監視虛擬機運行時狀態信息的命令,它可以顯示出虛擬機進程中的類裝載,內存,垃圾收集,JIT編譯等運行數據
命令格式 | jstat [option] LVMID [interval] [count] :interval 連續輸出的時間間隔,count 連續輸出次數 |
option參數 | 描述 |
class | class loader的行爲統計 |
compiler | HotSpt JIT編譯器行爲統計 |
gc | 垃圾回收堆的行爲統計 |
gccapacity | 各個垃圾回收代容量(young,old,perm)和他們相對應的空間統計 |
gcutil | 垃圾回收統計概述 |
gccause | 垃圾收集統計概述-同gcutil ,附加最後兩次垃圾回收時間的原因 |
gcnew | 新生代行爲統計 |
gcnewcapacity | 新生代與其相應的空間內存的統計 |
gcold | 老年代和永生代行爲統計 |
gcoldcapacity | 老年代與其相應的空間內存的統計 |
gcpermcapacity | 永生代與其相應的空間內存統計 |
printcompilation | HotSpot編譯方法統計 |
2.1 -class 監控類裝載,卸載數量,總空間以及消耗時間
jstat -class 5280
Loaded Bytes Unloaded Bytes Time
15982 31281.3 664 1118.1 39.24
Loaded: 加載class的數量
Bytes: class字節大小
Unloaded:未加載class的數量
Bytes: 未加載class的字節大小
Time:加載時間
2.2 -compiler 輸出JIT編譯過的方法數量,耗時等,
jstat -compiler 5280
Compiled Failed Invalid Time FailedType FailedMethod
25611 0 0 195.27 0
Compiled-編譯數量;Failed-編譯失敗數量;Invalid-無效數量;Time-編譯耗時;FailedType-失敗類型;FailedMethod-失敗方法的全限定名。
2.3 -gc 垃圾回收堆的行爲統計(C-總容量;U-使用容量)
jstat -gc 5280
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
3584.0 1024.0 0.0 730.0 212480.0 79814.8 273408.0 201376.5 106456.0 94237.2 13272.0 10362.5 2399 26.589 7 28.622 55.211
S0C,S1C:表示第一個和第二個生存區的容量
S0U,S1U:表示第一個和第二個生存區的已使用的容量
EC,EU:表示eden區域的容量和已用量
OC,OU:表示老年代區的容量和已用量
PC,PU:表示持久代的內存容量和已用量
YGC,YGT:表示新生代的GC發生的次數和耗時
FGCT,FGCT:表示老年代Full GC發生的次數和耗時
GCT:表示總的GC耗時
2.4 -gccapacity 和-gc相同,同時輸出java堆各區域使用的最大,最小空間;
jstat -gccapacity 2654
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
41984.0 672256.0 239104.0 512.0 4096.0 97792.0 84992.0 1345024.0 162304.0 162304.0 0.0 1355776.0 352640.0 0.0 1048576.0 45696.0 161368 1471
NGCMN、NGCMX:新生代佔用的最小,最大空間
OGCMN、OGCMX:老年代佔用的最大最小空間
OGC、OC:當前代老年代的容量
PGCMN、PGCMX:perm佔用的最小,最大空間
2.5 -gcutil 和-gc一樣,只是輸出的是已經使用的空間佔總空間的百分比
jstat -gcutil 2654
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
53.12 0.00 17.48 86.80 59.93 68.68 161376 3205.345 1471 1049.639 4254.984
2.6 -gccause 垃圾收集統計概述,和-gcutil一樣,增加了最近兩次垃圾回收事件的原因
jstat -gccause 2654
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
53.12 0.00 27.30 86.80 59.93 68.68 161376 3205.345 1471 1049.639 4254.984 Allocation Failure No GC
LGCC:最近垃圾回收的原因,GCC:當前垃圾回收的原因
2.7 -gcnew 統計新生代的行爲
jstat -gcnew 2654
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
1024.0 3584.0 544.0 0.0 1 15 3584.0 76288.0 27588.8 161376 3205.345
TT:Tenuring threshold提升閾值
MTT:最大的tenuring threshold
DSS:survivor區域的大小(KB)
2.8 -gcnewcapacity 新生代相應內存統計
jstat -gcnewcapacity 2654
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
41984.0 672256.0 415232.0 223744.0 3584.0 223744.0 8192.0 671232.0 289792.0 161464 1472
NGC:當前年輕代的容量KB;
S0CMX,S0C:最大的S0空間和當前S0使用空間
ECMX,EC:最大的Eden空間和當前eden空間
2.9 -gcold -gcoldcapacity -gcpermcapacity 統計老年代的行爲
2.10 -printcompilation hotspot編譯方法統計
jstat -printcompilation 2654
Compiled Size Type Method
79318 5 1 java/util/concurrent/CopyOnWriteArrayList getArray
Compiled:被執行的編譯任務數量
Size:方法字節碼的字節數
Type:編譯類型
Method:編譯方法的類名和方法名
3. jmap :用於生成heap dump文件,還可以使用參數配置在OOM時候自動生成dump文件;jmap不僅能生成dump文件,還可以查詢finalize執行隊列,java堆和永久代的詳細信息,如當前使用率,當前使用的是那種收集器等。
命令格式 | jmap [option] LVMID |
option參數 | 描述 |
dump | 生成堆轉儲快照 |
finalizerinfo | 顯示在F-Quenue隊列等待Finalizer線程執行finalizer方法的對象 |
heap |
顯示java堆詳細信息 |
histo | 顯示堆哄對象的統計信息 |
permstat | |
F | 當-dump沒有響應時,強制生成dump快照 |
3.1 -dump -dump:live,format=b,file=dump.hprof 2654
dump堆到文件,format指定輸出格式,live指明是活着的對象,file指定文件存儲
4. jstack 用於生成java虛擬機當前時刻的線程快照,線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成
線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖,死循環,請求外部資源導致的長時間等待,線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在後臺做什麼事情,或者等待什麼資源,如果java程序奔潰生成core文件,jstack工具可以用來獲的core文件的java stack 和native stack的信息,如果現在運行的java程序呈現hung的狀態,jstack是非常有用的;
命令格式 | jstack [option] LVMID |
option參數 | 含義 |
-F | 當正常輸出請求不被響應時,強制輸出線程堆棧 |
-l | 除堆棧外,顯示關於鎖的附加信息 |
-m | 如果調用到本地方法的話,可以顯示C/C++的堆棧 |