☕[JVM效能專題](1)效能監控-命令列工具

liboware發表於2021-06-16

使用適當的虛擬機器監控和分析工具可以加快我們分析資料、定位解決問題的速度。這些命令列工具大多是jdk/lib/tools.jar類庫的一層薄包裝,主要的功能程式碼是在tools類庫中實現的,如圖一。

☕[JVM效能專題](1)效能監控-命令列工具

【JVM Process Status Tool】,顯示指定系統內所有的HotSpot虛擬機器程式

jps命令格式

jps [ options ] [ hostid ]

執行樣例:

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

option引數:

選項 作用
-q 只輸出LVMID,省略主類的名稱
-m 輸出虛擬機器程式啟動時傳遞給主類main()函式的引數
-l 輸出主類的全名,如果程式執行的是jar包,輸出Jar路徑
-v 輸出虛擬機器程式啟動時的JVM引數(是啟動程式的jvm引數)

【JVM Statistics Monitoring Tool】,用於監視虛擬機器各種執行狀態資訊的命令列工具。它可以顯示出虛擬機器程式中的類裝載、記憶體、垃圾收集、JIT(Just In Time)即時編譯等執行資料。

jstat命令格式:

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

option引數:

選項 作用
-class(類載入器) class loader的行為統計。監視類裝載、解除安裝數量、總空間以及類裝載所耗費的時間
-gc(GC堆狀態) 垃圾回收堆的行為統計。監視Java堆狀況,包括Eden區、兩個Survivor區、老年代、永久代等的容量、已用空間、GC時間合計等資訊
-gccapacity(各區大小) 監視內容與-gc基本相同,但輸出主要關注java堆各個區域(young,old,perm)使用到的最大、最小空間
-gcutil(GC統計彙總) 監視內容與-gc基本相同,但輸出主要關注已使用空間佔總空間的百分比
-gccause(最近一次GC統計和原因) 與-gcutil功能一樣,但是會額外輸出導致上一次GC的原因
-gcnew(新區統計) 新生代行為統計。監視新生代GC狀況
-gcnewcapacity(新區大小) 監視內容與-gcnew基本相同,輸出主要關注使用到的最大、最小空間
-gcold(養老區大小) 年老代和永生代行為統計。監視老年代和永久代GC狀況
-gcoldcapacity(養老區大小) 年老代行為統計。輸出主要關注使用到的最大、最小空間
-gcpermcapacity(永久代大小) 永生代行為統計。輸出主要關注使用到的最大、最小空間
-compiler(JIT) HotSpt JIT編譯器行為統計。輸出JIT編譯器編譯過的方法、耗時等資訊
-printcompilation(HotSpot編譯統計) HotSpot編譯方法統計。輸出已經被JIT編譯的方法

option引數詳解:

-class:

監視類裝載、解除安裝數量、總空間以及類裝載所耗費的時間

執行樣例:

[root@libo-sys ~]# 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

上面的引數:

  • 程式號:5256
  • 執行頻率:每500毫秒查詢一次程式垃圾收集狀況
  • 一共查詢3次

返回結果:

  • Loaded:載入的class數量
  • Bytes:載入的class位元組大小
  • Unloaded:未載入的class數量
  • Bytes:未載入的class位元組大小
  • Time:載入時間

-gc

監視Java堆狀況,包括Eden區、兩個Survivor區、老年代、永久代等的容量、已用空間、GC時間合計等資訊

執行樣例:

[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區的總容量
S1C:survivor1區的總容量
S0U:survivor0區已使用的容量
S1U:survivor1區已使用的容量
EC:Eden區的總容量
EU:Eden區已使用的容量
OC:Old區的總容量
OU:Old區已使用的容量
PC:當前perm的容量 (KB)
PU:perm的使用 (KB)
YGC:新生代垃圾回收次數
YGCT:新生代垃圾回收時間
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間

-gccapacity

監視內容與-gc基本相同,輸出主要關注java堆各個區域(young,old,perm)使用到的最大、最小空間

執行樣例:

[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區的空間
S1C:當前survivor1區的空間
EC:當前Eden區的空間
OGCMN : 老年代佔用的最小空間
OGCMX : 老年代佔用的最大空間
OGC:當前年老代的容量 (KB)
OC:當前年老代的空間 (KB)
PGCMN : perm佔用的最小空間
PGCMX : perm佔用的最大空間
PGC : 當前perm區的容量
PC : 當前perm區的空間
YGC:新生代垃圾回收次數
FGC:老年代垃圾回收次數

-gcutil

監視內容與-gc基本相同,但輸出主要關注已使用空間佔總空間的百分比執行樣例:

[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區佔用百分比
S1:survivor1區佔用百分比
E:Eden區佔用百分比
O : 年老代佔用百分比
P : 永久代佔用百分比
YGC:新生代垃圾回收次數
YGCT:新生代垃圾回收時間
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間

-gccause

與-gcutil功能一樣,但是會額外輸出導致上一次GC的原因

執行樣例:

[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區佔用百分比
S1:survivor1區佔用百分比
E:Eden區佔用百分比
O : 年老代佔用百分比
P : 永久代佔用百分比
YGC:新生代垃圾回收次數
YGCT:新生代垃圾回收時間
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間
LGCC:最近垃圾回收的原因
GCC:當前垃圾回收的原因

-gcnew

監視新生代GC狀況

執行樣例:

[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區的總容量
S1C:survivor1區的總容量
S0U:survivor0區已使用的容量
S1U:survivor1區已使用的容量
TT:Tenuring threshold(晉升老年代的記憶體閾值)
MTT:最大的tenuring threshold(晉升老年代的年齡閾值)
DSS:survivor區域大小 (KB)
EC:Eden區的總容量
EU:Eden區已使用的容量
YGC:新生代垃圾回收次數
YGCT:新生代垃圾回收時間

-gcnewcapacity

監視內容與-gcnew基本相同,輸出主要關注使用到的最大、最小空間

執行樣例:

[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區佔用的最大空間
S0C:當前survivor0區的空間
S1CMX : survivor1區佔用的最大空間
S1C:當前survivor1區的空間
ECMX : Eden區佔用的最大空間
EC:當前Eden區的空間
YGC:新生代垃圾回收次數
FGC:老年代垃圾回收次數

-gcold

監視老年代和永久代GC狀況

執行樣例:

[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區的總容量
OU:Old區已使用的容量
YGC:新生代垃圾回收次數
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間


-gcoldcapacity

輸出主要關注使用到的最大、最小空間

執行樣例:

[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:新生代垃圾回收次數
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間

-gcpermcapacity

永生代行為統計,輸出主要關注使用到的最大、最小空間

執行樣例:

[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:新生代垃圾回收次數
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收時間
GCT:垃圾回收總消耗時間

-compiler

HotSpt JIT編譯器行為統計。輸出JIT編譯器編譯過的方法、耗時等資訊,執行樣例:

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

Compiled : 編譯數量
Failed : 編譯失敗數量
Invalid : 無效數量
Time : 編譯耗時
FailedType : 失敗型別
FailedMethod : 失敗方法的全限定名

-printcompilation

HotSpot編譯方法統計。輸出已經被JIT編譯的方法

執行樣例:

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

Compiled:被執行的編譯任務的數量
Size:方法位元組碼的位元組數
Type:編譯型別
Method:編譯方法的類名和方法名。類名使用”/” 代替 “.” 作為空間分隔符. 方法名是給出類的方法名. 格式是與- XX:+PrintComplation選項一致

jinfo:Java配置資訊工具

  • Configuration Info for Java,顯示虛擬機器配置資訊,實時檢視和調整虛擬機器各項引數

  • jps命令的-v選項可以檢視虛擬機器啟動時顯示指定的引數,如果想要檢視未被顯示指定的引數的系統預設值就要使用jinfo命令的 -flag選項進行查詢了。

jinfo命令格式:

jinfo [ option ] [ args ] lvmid

執行樣例:

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

option引數:

-flag : 輸出指定args引數的值
-flags : 不需要args引數,輸出所有JVM引數的值(注意 s)顯示虛擬機器的引數
-sysprops : 輸出系統屬性,等同於System.getProperties()

jmap:Java記憶體影像工具

Memory Map for Java,生成堆轉儲快照(一般稱為heapdump或dump檔案)。 jmap的作用不僅僅是為了獲取dump檔案,還可以查詢finalize執行佇列、Java堆和永久代的詳細資訊,如空間使用率、當前使用的是哪種收集器等。

jmap命令格式:

jmap [ option ] lvmid

option引數:

選項 作用
-dump 生成Java堆轉儲快照。格式為:-dump:[live, ]format=b,file=其中live子引數說明是否只dump出存活的物件
-finalizerinfo 顯示在F-Queue佇列中等待Finalizer執行緒執行finalize方法的物件
-heap 顯示Java堆詳細資訊。如使用哪種垃圾收集器、引數配置、分代狀況等
-histo 顯示堆中物件的統計資訊,包括類、例項數量、合計容器
-permstat 以ClassLoader為統計口徑顯示永久代記憶體狀態
-F 當虛擬機器程式對-dump沒有響應時,可使用此選項強制生成dump快照

option引數詳解:

-dump

生成Java堆轉儲快照。格式為:-dump:[live, ]format=b,file= live指明是否只dump出存活的物件,format指定輸出格式,file指定檔名

執行樣例:

[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這個字尾是為了後續可以直接用MAT(Memory Anlysis Tool)開啟。


-finalizerinfo

顯示在F-Queue佇列中等待Finalizer執行緒執行finalize方法的物件

執行樣例:

[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執行緒執行finalize方法的物件。

-heap

顯示Java堆詳細資訊。如使用哪種垃圾收集器、引數配置、分代狀況等

執行樣例:

[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: //堆記憶體初始化配置
   MinHeapFreeRatio = 40 //對應jvm啟動引數-XX:MinHeapFreeRatio設定JVM堆最小空閒比率(default 40)
   MaxHeapFreeRatio = 70 //對應jvm啟動引數 -XX:MaxHeapFreeRatio設定JVM堆最大空閒比率(default 70)
   MaxHeapSize      = 1040187392 (992.0MB) //對應jvm啟動引數-XX:MaxHeapSize設定JVM堆的最大大小
   NewSize          = 1310720 (1.25MB)//對應jvm啟動引數-XX:NewSize設定JVM堆的新生代的預設大小
   MaxNewSize       = 17592186044415 MB//對應jvm啟動引數-XX:MaxNewSize設定JVM堆的新生代的最大大小
   OldSize          = 5439488 (5.1875MB)//對應jvm啟動引數-XX:OldSize設定JVM堆的老生代的大小
   NewRatio         = 2 //對應jvm啟動引數-XX:NewRatio設定新生代和老生代的大小比率
   SurvivorRatio    = 8 //對應jvm啟動引數-XX:SurvivorRatio設定新生代中Eden區與Survivor區的大小比值 
   PermSize         = 21757952 (20.75MB) //對應jvm啟動引數-XX:PermSize設定JVM堆的永久代的初始大小
   MaxPermSize      = 85983232 (82.0MB) //對應jvm啟動引數-XX:MaxPermSize設定JVM堆的永久代的最大大小

 Heap Usage: //堆記憶體使用情況
 PS Young Generation
 Eden Space: //Eden區記憶體分佈
   capacity = 130023424 (124.0MB) //Eden區總容量
   used     = 37682272 (35.936614990234375MB)  //Eden區已使用
   free     = 92341152 (88.06338500976562MB) //Eden區剩餘容量
   28.981141121156753% used //Eden區使用比率
 From Space: //Survivor0區的記憶體分佈
   capacity = 786432 (0.75MB)
   used     = 720928 (0.687530517578125MB)
   free     = 65504 (0.062469482421875MB)
   91.67073567708333% used
 To Space: //Survivor1區的記憶體分佈
   capacity = 6422528 (6.125MB)
   used     = 0 (0.0MB)
   free     = 6422528 (6.125MB)
   0.0% used
 PS Old Generation //當前的Old區記憶體分佈
   capacity = 43319296 (41.3125MB)
   used     = 20436424 (19.48969268798828MB)
   free     = 22882872 (21.82280731201172MB)
   47.176260666840015% used
 PS Perm Generation //當前的永久代記憶體分佈
   capacity = 56164352 (53.5625MB)
   used     = 56004904 (53.410438537597656MB)
   free     = 159448 (0.15206146240234375MB)
   99.71610462095245% used

可以很清楚的看到Java堆中各個區域目前的情況。


-histo

顯示堆中物件的統計資訊,包括類、例項數量、合計容器。(因為在dump:live前會進行full gc,如果帶上live則只統計活物件,因此不加live的堆大小要大於加live堆的大小 )

執行樣例:

[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
[ 陣列,如[I表示int[]
[L+類名 其他物件

-permstat

以ClassLoader為統計口徑顯示永久代記憶體狀態。對於每個類載入器而言,它的名稱、活躍度、地址、父類載入器、它所載入的類的數量和大小都會顯示。此外,包含的字串數量和大小也會顯示。

執行樣例:

[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的分析功能相對於專業的分析工具(VisualVM、IBM HeapAnalyzer等)比較簡陋。

jhat命令格式:

jhat [ option ] [ heapdumpfile ]

執行樣例:

[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快照很大的情況下分配記憶體去啟動HTTP伺服器,執行完之後就可在瀏覽器開啟Http://localhost:7000 進行快照分析。堆快照分析主要在最後面的Heap Histogram裡,裡面根據class列出了dump的時候所有存活物件。

具體排查時需要結合程式碼,看是否存在大量應該被回收的物件一直被引用或者是否有佔用記憶體特別大的物件無法被回收。

通常情況下,是將dump檔案down下來,通過專業的工具(VisualVM、IBM HeapAnalyzer等)來進行分析。

option引數:

選項 作用
-stack false、true 關閉物件分配呼叫棧跟蹤。 如果分配位置資訊在堆轉儲中不可用,則必須將此標誌設定為 false。預設值為 true。
-refs false、true 關閉物件引用跟蹤。預設值為 true。預設情況下, 返回的指標是指向其他特定物件的物件,如反向連結或輸入引用,會統計/計算堆中的所有物件。
-port port-number 設定 jhat HTTP server 的埠號。預設值 7000
-exclude exclude-file 指定物件查詢時需要排除的資料成員列表檔案。 例如,如果檔案列出了 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 表示不輸出除錯資訊。 值越大則表示輸出更詳細的 debug 資訊。
-version 啟動後只顯示版本資訊就退出。
-J < flag > 因為 jhat 命令實際上會啟動一個JVM來執行,通過 -J 可以在啟動JVM時傳入一些啟動引數。例如, -J-Xmx512M 則指定執行 jhat 的Java虛擬機器使用的最大堆記憶體為 512M。如果需要使用多個JVM啟動引數,則傳入多個 -Jxxxxxx。

jstack:Java堆疊跟蹤工具

Stack Trace for Java,顯示虛擬機器的執行緒快照。執行緒快照是當前虛擬機器內每一條執行緒正在執行的方法堆疊的集合,生成執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致的長時間等待等。 執行緒出現停頓的時候通過jstack來檢視各個執行緒的呼叫堆疊,就可以知道沒有響應的執行緒到底在後臺做什麼事情,或者等待什麼資源。

jstack命令格式:

jstack [ option ] lvmid

執行樣例:

[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引數:

-F : 當正常輸出請求不被響應時,強制輸出執行緒堆疊
-l : 除堆疊外,顯示關於鎖的附加資訊
-m : 如果呼叫到本地方法的話,可以顯示C/C++的堆疊

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章