《深刻理解Java虛擬機》(四)虛擬機性能監控與故障處理工具

虛擬機性能監控與故障處理工具 詳解

4.1 概述

本文參考的是周志明的 《深刻理解Java虛擬機》 第四章 ,爲了整理思路,簡單記錄一下,方便後期查閱。html

JDK自己提供了不少方便的JVM性能調優監控工具,除了集成式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,本文但願能起拋磚引玉之用,讓你們能開始對JVM性能調優的經常使用工具備所瞭解。java

4.2 JDK的命令行工具

命令名稱 全稱 用途
jstat JVM Statistics Monitoring Tool 用於收集Hotspot虛擬機各方面的運行數據
jps JVM Process Status Tool 顯示指定系統內全部的HotSpot虛擬機進程
jinfo Configuration Info for Java 顯示虛擬機配置信息
jmap JVM Memory Map 生成虛擬機的內存轉儲快照,生成heapdump文件
jhat JVM Heap Dump Browser 用於分析heapdump文件,它會創建一個HTTP/HTML服務器,讓用戶在瀏覽器上查看分析結果
jstack JVM Stack Trace 顯示虛擬機的線程快照

4.2.1 jps:虛擬機進程情況工具

jps [options] [hostid]
-l : 輸出主類全名或jar路徑
-q : 只輸出LVMID
-m : 輸出JVM啓動時傳遞給main()的參數
-v : 輸出JVM啓動時顯示指定的JVM參數
$ jps -l
16256 sun.tools.jps.Jps
14904 org.jetbrains.jps.cmdline.Launcher
15016 com.ecej.esmart.gateway.service.impl.PengleiTest
  • 功能:能夠列出正在運行的虛擬機進程,併線上虛擬機執行的主類名稱及其本地虛擬機惟一ID(LVMID);
  • 對於本地虛擬機來講,LVMID和操做系統的進程ID是一致的;
  • 其餘的工具一般都須要依賴jps獲取LVMID;
  • 主要選項:-q(只輸出LVMID)、-m(輸出傳給main函數的參數)、-l(輸出主類的全名)、-v(輸出虛擬機啓動JVM參數);

4.2.2 jstat:虛擬機統計信息監視工具

jstat(JVM statistics Monitoring)是用於監視虛擬機運行時狀態信息的命令,它能夠顯示出虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。mysql

命令格式算法

$ jstat [option] LVMID [interval] [count]

參數sql

  • [option] : 操做參數
  • LVMID : 本地虛擬機進程ID
  • [interval] : 連續輸出的時間間隔
  • [count] : 連續輸出的次數

option 參數總覽apache

選       項 做       用
-class 監視類裝載、卸載數量、總空間以及類裝載所耗費的時間
-gc 監視Java堆情況,包括Eden區、兩個Survivor區、、老年代、永久帶等的容量、已用空間、GC時間合計等信息
-gccapacity 監視內容基本與-gc相同,但輸出主要關注Java堆各個區域使用到的最大、最小空間
-gcutil 監視內容基本與-gc相同,但輸出主要關注已使用的空間佔總空間的百分比
-gccause 與-gcutil功能同樣,可是會額外輸出致使上一次GC產生的緣由
-gcnew 監視新生代GC情況
-gcnewcapacity 監視內容基本與-gcnew相同,但輸出主要關注使用到的最大、最小空間
-gcold 監視老年代GC情況
-gcoldcapacity 監視內容基本與-gcold相同,但輸出主要關注使用到的最大、最小空間
-gcpermcapacity 輸出永久代使用到的最大、最小空間
-compiler 輸出JIT編譯器編譯過的方法、耗時等信息
-printcompilation 輸出已經被JIT編譯的方法

option 參數詳解segmentfault

-class瀏覽器

監視類裝載、卸載數量、總空間以及耗費的時間服務器

$ jstat -class 14988
Loaded  Bytes  Unloaded  Bytes     Time
   577  1152.8        0     0.0       0.17
  • Loaded : 加載class的數量
  • Bytes : class字節大小
  • Unloaded : 未加載class的數量
  • Bytes : 未加載class的字節大小
  • Time : 加載時間

-compilerjvm

輸出JIT編譯過的方法數量耗時等

$ jps -l -m
8657 org.apache.catalina.startup.Bootstrap start
12706 com.ecej.cust.service.run.Startup 60001
52132 sun.tools.jps.Jps -l -m
55671 customer.jar --server.port=8082 --log.home=/data/dubbo/logs/customer --log.level=info --log.stdout=0 ecej.ops.iswitch=1 --ecej.ops.port=80 --jmx.rmi.port=9991

$ jstat -compiler 55671
Compiled Failed Invalid   Time   FailedType FailedMethod
   13784      1       0   102.02          1 com/mysql/jdbc/AbandonedConnectionCleanupThread run
  • Compiled : 編譯數量
  • Failed : 編譯失敗數量
  • Invalid : 無效數量
  • Time : 編譯耗時
  • FailedType : 失敗類型
  • FailedMethod : 失敗的方法

-gc

垃圾回收堆的行爲統計,經常使用命令

$ jstat -gc 55671
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
512.0  512.0   0.0    0.0   1285632.0 56336.6   259584.0   61064.8   74416.0 72873.0 8368.0 8015.0    114    0.854  103    14.911   15.765
  • S0C:第一個倖存區的大小
  • S1C:第二個倖存區的大小
  • S0U:第一個倖存區的使用大小
  • S1U:第二個倖存區的使用大小
  • EC:伊甸園區的大小
  • EU:伊甸園區的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法區大小
  • MU:方法區使用大小
  • CCSC:壓縮類空間大小
  • CCSU:壓縮類空間使用大小
  • YGC:年輕代垃圾回收次數
  • YGCT:年輕代垃圾回收消耗時間
  • FGC:老年代垃圾回收次數
  • FGCT:老年代垃圾回收消耗時間
  • GCT:垃圾回收消耗總時間
$ jstat -gc 55671 2000 20

這個命令意思就是每隔2000ms輸出1262的gc狀況,一共輸出20次

-gccapacity

同-gc,不過還會輸出Java堆各區域使用到的最大、最小空間

$ jstat -gccapacity 55671
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
 84992.0 1360384.0 1287168.0  512.0  512.0 1285632.0   171008.0  2721280.0   259584.0   259584.0      0.0 1116160.0  74416.0      0.0 1048576.0   8368.0    114   103
  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:當前新生代容量
  • S0C:第一個倖存區大小
  • S1C:第二個倖存區的大小
  • EC:伊甸園區的大小
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:當前老年代大小
  • OC:當前老年代大小
  • MCMN:最小元數據容量
  • MCMX:最大元數據容量
  • MC:當前元數據空間大小
  • CCSMN:最小壓縮類空間大小
  • CCSMX:最大壓縮類空間大小
  • CCSC:當前壓縮類空間大小
  • YGC:年輕代gc次數
  • FGC:老年代GC次數 - NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:當前新生代容量
  • S0C:第一個倖存區大小
  • S1C:第二個倖存區的大小
  • EC:伊甸園區的大小
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:當前老年代大小
  • OC:當前老年代大小
  • MCMN:最小元數據容量
  • MCMX:最大元數據容量
  • MC:當前元數據空間大小
  • CCSMN:最小壓縮類空間大小
  • CCSMX:最大壓縮類空間大小
  • CCSC:當前壓縮類空間大小
  • YGC:年輕代gc次數
  • FGC:老年代GC次數

-gcutil

同-gc,不過輸出的是已使用空間佔總空間的百分比

$ jstat -gcutil 55671
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00   6.25  23.52  97.93  95.78    114    0.854   103   14.911   15.765
  • S0 -Heap上的Survivor space 0區已使用空間的百分比
  • S1 -Heap上的Survivor space 1區已使用空間的百分比
  • E -Heap上Eden space區已使用空間的百分比
  • O -Heap上的Old space區已使用空間的百分比
  • P -Perm space區已使用空間的百分比
  • YGC -從應用程序啓動到採樣時發生Yang GC 的次數
  • YGCT -從應用程序啓動到採樣時Yang GC所用的時間【單位秒】
  • FGC -從應用程序啓動到採樣時Full GC的次數
  • FGCT -從應用程序啓動到採樣時Full GC所用的時間
  • GCT -從應用程序啓動到採樣時用於垃圾回收的總時間【單位秒】

-gcnew

統計新生代的行爲

$ jstat -gcnew 55671
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
 512.0  512.0    0.0    0.0 15  15  512.0 1285632.0 100094.5    114    0.854
  • S0C:第一個倖存區大小
  • S1C:第二個倖存區的大小
  • S0U:第一個倖存區的使用大小
  • S1U:第二個倖存區的使用大小
  • TT:對象在新生代存活的次數
  • MTT:對象在新生代存活的最大次數
  • DSS:指望的倖存區大小
  • EC:伊甸園區的大小
  • EU:伊甸園區的使用大小
  • YGC:年輕代垃圾回收次數
  • YGCT:年輕代垃圾回收消耗時間

-gcnewcapacity

新生代與其相應的內存空間的統計

$ jstat -gcnewcapacity  55671
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
   84992.0  1360384.0  1287168.0 453120.0    512.0 453120.0    512.0  1359360.0  1285632.0   114   103
  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:當前新生代容量
  • S0CMX:最大幸存1區大小
  • S0C:當前倖存1區大小
  • S1CMX:最大幸存2區大小
  • S1C:當前倖存2區大小
  • ECMX:最大伊甸園區大小
  • EC:當前伊甸園區大小
  • YGC:年輕代垃圾回收次數
  • FGC:老年代回收次數

-gcold

統計舊生代的行爲

$  jstat -gcold 55671
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
 74416.0  72873.0   8368.0   8015.0    259584.0     61064.8    114   103   14.911   15.765
  • MC:方法區大小
  • MU:方法區使用大小
  • CCSC:壓縮類空間大小
  • CCSU:壓縮類空間使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • YGC:年輕代垃圾回收次數
  • FGC:老年代垃圾回收次數
  • FGCT:老年代垃圾回收消耗時間
  • GCT:垃圾回收消耗總時間

-gcoldcapacity

統計舊生代的大小和空間

$ jstat -gcoldcapacity 55671
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
   171008.0   2721280.0    259584.0    259584.0   116   105   15.170   16.033
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:當前老年代大小
  • OC:老年代大小
  • YGC:年輕代垃圾回收次數
  • FGC:老年代垃圾回收次數
  • FGCT:老年代垃圾回收消耗時間
  • GCT:垃圾回收消耗總時間

-gcpermcapacity

永生代行爲統計

在 JDK 8 刪除永久代
JDK 8 Java永久代去哪兒了
在Hotspot中的永久代碼的內容的一部分移動到Java堆中,其他部分移動到本地內存
$ 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

-printcompilation

hotspot編譯方法統計

$ jstat -printcompilation 55671
Compiled  Size  Type Method
   13785    123    1 java/io/DataOutputStream write
  • Compiled:被執行的編譯任務的數量
  • Size:方法字節碼的字節數
  • Type:編譯類型
  • Method:編譯方法的類名和方法名。類名使用"/" 代替 "." 做爲空間分隔符. 方法名是給出類的方法名. 格式是一致於HotSpot - XX:+PrintComplation 選項

4.2.3 jinfo:Java配置信息工具

jinfo(JVM Configuration info)這個命令做用是實時查看和調整虛擬機運行參數。
以前的jps -v口令只能查看到顯示指定的參數,若是想要查看未被顯示指定的參數的值就要使用jinfo口令

命令格式

jinfo [option] [args] LVMID

option參數

  • -flag : 輸出指定args參數的值
  • -flags : 不須要args參數,輸出全部JVM參數的值
  • -sysprops : 輸出系統屬性,等同於System.getProperties()
$ jinfo -flags 55671
Attaching to process ID 55671, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=262144000 -XX:MaxHeapSize=4179623936 -XX:MaxNewSize=1393033216 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=87031808 -XX:OldSize=175112192 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
Command line:

4.2.4 jmap:Java內存映像工具

  • 功能:用於生成堆轉儲快照(通常稱爲heapdump或dump文件)
  • 其餘可生成 heapdump 的方式:使用參數-XX:+HeapDumpOnOutOfMemoryError使用參數-XX:+HeapDumpOnCtrlBreak而後使用 Ctrl+Break 生成;Linux系統使用kill -3生成
  • 另外它還能夠查詢 finalize 執行隊列、Java堆和永久代的詳細信息

命令格式

jmap [option] LVMID

option參數

  • dump : 生成堆轉儲快照
  • finalizerinfo : 顯示在F-Queue隊列等待Finalizer線程執行finalizer方法的對象
  • heap : 顯示Java堆詳細信息
  • histo : 顯示堆中對象的統計信息
  • permstat : to print permanent generation statistics
  • F : 當-dump沒有響應時,強制生成dump快照

-dump
經常使用格式

-dump::live,format=b,file=<filename> pid

dump堆到文件,format指定輸出格式,live指明是活着的對象,file指定文件名

$ jmap -dump:live,format=b,file=penglei.hprof 55671
Dumping heap to /home/publish/penglei.hprof ...
Heap dump file created

penglei.hprof這個後綴是爲了後續能夠直接用MAT(Memory Anlysis Tool)打開。

-finalizerinfo

打印等待回收對象的信息

$ jmap -finalizerinfo 55671
Attaching to process ID 55671, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01
Number of objects pending for finalization: 0

能夠看到當前F-QUEUE隊列中並無等待Finalizer線程執行finalizer方法的對象。

-heap

打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用狀況,能夠用此來判斷內存目前的使用狀況以及垃圾回收狀況

$ jmap -heap 55671
Attaching to process ID 55671, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01

using thread-local object allocation.
Parallel GC with 8 thread(s)//GC 方式 

Heap Configuration://堆內存初始化配置
   MinHeapFreeRatio         = 0 //對應jvm啓動參數-XX:MinHeapFreeRatio設置JVM堆最小空閒比率(default 40)
   MaxHeapFreeRatio         = 100 //對應jvm啓動參數 -XX:MaxHeapFreeRatio設置JVM堆最大空閒比率(default 70)
   MaxHeapSize              = 4179623936 (3986.0MB)//對應jvm啓動參數-XX:MaxHeapSize=設置JVM堆的最大大小
   NewSize                  = 87031808 (83.0MB)//對應jvm啓動參數-XX:NewSize=設置JVM堆的‘新生代’的默認大小
   MaxNewSize               = 1393033216 (1328.5MB)//對應jvm啓動參數-XX:MaxNewSize=設置JVM堆的‘新生代’的最大大小
   OldSize                  = 175112192 (167.0MB)//對應jvm啓動參數-XX:OldSize=<value>:設置JVM堆的‘老生代’的大小
   NewRatio                 = 2//對應jvm啓動參數-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio            = 8//對應jvm啓動參數-XX:SurvivorRatio=設置年輕代中Eden區與Survivor區的大小比值 
   MetaspaceSize            = 21807104 (20.796875MB)//對應jvm啓動參數--XX:MetaspaceSize  是分配給類元數據空間
   CompressedClassSpaceSize = 1073741824 (1024.0MB)//對應jvm啓動參數-XX:CompressedClassSpaceSize 默認也有1G,我能猜到metaspace的做者不但願出現它相關的OOM問題
   MaxMetaspaceSize         = 17592186044415 MB//對應jvm啓動參數XX:MaxMetaspaceSize設置最大的本地內存類員工間可用於垃圾回收。默認沒有限制,也就是說你的系統內存上限是多少它就是多少若是沒有指定的話,元空間會根據應用程序運行時的須要動態地調整大小。
   G1HeapRegionSize         = 0 (0.0MB)//當使用G1收集器時,設置java堆被分割的大小。這個大小範圍在1M到32M之間

Heap Usage://堆內存使用狀況
PS Young Generation
Eden Space://Eden區內存分佈
   capacity = 1317011456 (1256.0MB)//Eden區總容量
   used     = 46816712 (44.64789581298828MB)//Eden區已使用
   free     = 1270194744 (1211.3521041870117MB)//Eden區剩餘容量
   3.554768774919449% used //Eden區使用比率
From Space://其中一個Survivor區的內存分佈
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
To Space://另外一個Survivor區的內存分佈
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
PS Old Generation//當前的Old區內存分佈
   capacity = 312999936 (298.5MB)
   used     = 62510688 (59.614837646484375MB)
   free     = 250489248 (238.88516235351562MB)
   19.971469898319725% used

32160 interned Strings occupying 3634120 bytes.
[publish@YZ-PTEST-CUS-WEB-01 ~]$

能夠很清楚的看到Java堆中各個區域目前的狀況。

4.2.5 jhat:虛擬機堆轉儲快照分析工具

  • 功能:用於分析jmap生成的heapdump。其內置了一個微型的HTTP服務器,能夠在瀏覽器查看分析結果;
  • 實際不多用jhat,主要有兩個緣由:一是分析工程會耗用服務器資源;功能相對BisualVM、IBM HeapAnalyzer較爲簡陋;

命令格式

jhat [dumpfile]

參數

  • -stack false|true

關閉對象分配調用棧跟蹤(tracking object allocation call stack)。 若是分配位置信息在堆轉儲中不可用. 則必須將此標誌設置爲 false. 默認值爲 true.>

  • -refs false|true

關閉對象引用跟蹤(tracking of references to objects)。 默認值爲 true. 默認狀況下, 返回的指針是指向其餘特定對象的對象,如反向連接或輸入引用(referrers or incoming references), 會統計/計算堆中的全部對象。>

  • -port port-number

設置 jhat HTTP server 的端口號. 默認值 7000.>

  • -exclude exclude-file

指定對象查詢時須要排除的數據成員列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 若是文件列列出了 java.lang.String.value , 那麼當從某個特定對象 Object o 計算可達的對象列表時, 引用路徑涉及 java.lang.String.value 的都會被排除。>

  • -baseline exclude-file

指定一個基準堆轉儲(baseline heap dump)。 在兩個 heap dumps 中有相同 object ID 的對象會被標記爲不是新的(marked as not being new). 其餘對象被標記爲新的(new). 在比較兩個不一樣的堆轉儲時頗有用.>

  • -debug int

設置 debug 級別. 0 表示不輸出調試信息。 值越大則表示輸出更詳細的 debug 信息.>

  • -version

啓動後只顯示版本信息就退出>

  • -J< flag >

由於 jhat 命令實際上會啓動一個JVM來執行, 經過 -J 能夠在啓動JVM時傳入一些啓動參數. 例如, -J-Xmx512m 則指定運行 jhat 的Java虛擬機使用的最大堆內存爲 512 MB. 若是須要使用多個JVM啓動參數,則傳入多個 -Jxxxxxx.

$ jhat -J-Xmx512m dump.hprof
Reading from dump.hprof...
Dump file created Mon Jul 31 23:46:31 CST 2017
Snapshot read, resolving...
Resolving 1285013 objects...
Chasing references, expect 257 dots.................................................................................................................................................................................................................................................................
Eliminating duplicate references.................................................................................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

中間的-J-Xmx512m是在dump快照很大的狀況下分配512M內存去啓動HTTP服務器,運行完以後就可在瀏覽器打開 Http://localhost:7000進行快照分析
堆快照分析主要在最後面的Heap Histogram裏,裏面根據class列出了dump的時候全部存活對象。

4.2.6 jstack:Java堆棧跟蹤工具

jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等。 線程出現停頓的時候經過jstack來查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺作什麼事情,或者等待什麼資源。 若是java程序崩潰生成core文件,jstack工具能夠用來得到core文件的java stack和native stack的信息,從而能夠輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還能夠附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 若是如今運行的java程序呈現hung的狀態,jstack是很是有用的。

命令格式

jstack [option] LVMID

option參數

  • -F : 當正常輸出請求不被響應時,強制輸出線程堆棧
  • -l : 除堆棧外,顯示關於鎖的附加信息
  • -m : 若是調用到本地方法的話,能夠顯示C/C++的堆棧
$ jstack -l 55671|more
2017-08-01 00:20:58
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.65-b01 mixed mode):

"DubboClientHandler-10.32.32.31:7070-thread-6208" #13942 daemon prio=5 os_prio=0 tid=0x00007f4a40002800 nid=0xd5f1 waiting on condition [0x00007f4af0b5f000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000006ca25a240> (a java.util.concurrent.SynchronousQueue$TransferStack)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
    at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
    at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - None

"DubboClientHandler-10.32.32.54:60036-thread-1219" #13941 daemon prio=5 os_prio=0 tid=0x00007f4a640f4800 nid=0xd5ec waiting on condition [0x00007f4ae818f000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000006ca76a638> (a java.util.concurrent.SynchronousQueue$TransferStack)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
    at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
    at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - None
--More--

這裏有一篇文章解釋的很好
分析打印出的文件內容

《深刻理解Java虛擬機:JVM高級特性與最佳實踐_周志明.高清掃描版.pdf》

下載地址:連接:http://pan.baidu.com/s/1miBQCBY 密碼:9kbn

推薦閱讀

《深刻理解Java虛擬機》(一)Java虛擬機發展史

《深刻理解Java虛擬機》(二)Java虛擬機運行時數據區

《深刻理解Java虛擬機》(三)垃圾收集器與內存分配策略

《深刻理解Java虛擬機》(四)虛擬機性能監控與故障處理工具

《深刻理解Java虛擬機》(五)JVM調優 - 工具

《深刻理解Java虛擬機》(六)堆內存使用分析,GC 日誌解讀

參考

本文參考-純潔的微笑-jvm調優-命令篇

命令所有都本身試驗了一遍

參考-純潔的微笑-jvm調優-命令篇

Contact

  • 做者:鵬磊
  • 出處:http://www.ymq.io
  • Email:admin@souyunku.com
  • 版權歸做者全部,轉載請註明出處
  • Wechat:關注公衆號,搜雲庫,專一於開發技術的研究與知識分享

關注公衆號-搜雲庫

相關文章
相關標籤/搜索