Total time for which application threads were stop 超級長時間,這行日誌表明什麼,以及爲何時間會這麼長 ?java
Total time for which application threads were stopp 2.81 seconds,Stopping threads took :2.6 seconds安全
當GC發生時,每一個線程只有進入了SafePoint纔算是真正掛起,也就是真正的停頓,這個日誌的含義是整個GC過程當中STW的時間,配置了 -XX:+PrintGCApplicationStoppedTime 這個參數纔會打印這個信息。併發
重點: 第一個 2.81 seconds 是JVM啓動後的秒數,第二個 2.6 seconds 是 JVM發起STW的開始到結束的時間。特別地,若是是GC引起的STW,這條內容會緊挨着出如今GC log的下面。app
有關安全點的詳細說明,請移步:jvm
[Java JVM] Hotspot GC研究- GC安全點 (Safepoint&Stop The World)源碼分析
等待全部用戶線程進入安全點後並阻塞,作一些全局性操做的行爲。優化
Garbage collection pauses(垃圾回收).net
JIT相關,好比Code deoptimization, Flushing code cache線程
Class redefinition (e.g. javaagent,AOP代碼植入的產生的instrumentation)
Biased lock revocation 取消偏向鎖
Various debug operation (e.g. thread dump or deadlock check) dump 線程
配置 -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1 參數,虛擬機會打印以下日誌文件:
-XX:+PrintSafepointStatistics 打印安全點統計信息,
-XX:PrintSafepointStatisticsCount=n 設置打印安全點統計信息的次數;
vmop: 引起STW的緣由,以及觸發時間,本例中是GC。該項常見的輸出有:RevokeBias、BulkRevokeBias、Deoptimize、G1IncCollectionPause。
數字306936.812是虛擬機啓動後運行的秒數。GC log能夠根據該項內容定位Total time for which application threads…引起的詳細信息。
total : STW發生時,JVM存在的線程數目。
initially_running : STW發生時,仍在運行的線程數,這項是Spin階段的 時間來源
wait_to_block : STW須要阻塞的線程數目,這項是block階段的時間來源
sync = spin + block + 其餘。
RevokeBias、BulkRevokeBias、偏向鎖取消狀況。
Deoptimize、
G1IncCollectionPause GC GC 執行狀況。
分析 -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1 產生的日誌信息基本上STW的緣由都是RevokeBias或者BulkRevokeBias。這個是撤銷偏向鎖操做,雖然每次暫停的 時間很短,可是特別頻繁出現也會很耗時。
一些高併發的系統中,禁掉JVM偏向鎖優化,能夠提高系統的吞吐量。禁用偏向鎖的參數爲: -XX:-UseBiasedLocking
線上配置 -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1 參數,虛擬機打印以下日誌文件:
果真是撤銷偏向鎖搞得鬼,增長 -XX:-UseBiasedLocking 後,問題獲得解決.