一渗稍、遇到的問題
Total time for which application threads were stop 超級長時間冶忱,這行日志代表什么康吵,以及為什么時間會這么長
二迟蜜、日志的含義
Total time for which application threads were stopp 2.81 seconds向图,Stopping threads took :2.6 seconds
當(dāng)GC發(fā)生時枢希,每個線程只有進(jìn)入了SafePoint才算是真正掛起桌吃,也就是真正的停頓,這個日志的含義是整個GC過程中STW的時間苞轿,配置了 -XX:+PrintGCApplicationStoppedTime 這個參數(shù)才會打印這個信息茅诱。
重點(diǎn):第一個 2.81 seconds 是JVM啟動后的秒數(shù),第二個 2.6 seconds 是 JVM發(fā)起STW的開始到結(jié)束的時間搬卒。特別地瑟俭,如果是GC引發(fā)的STW,這條內(nèi)容會緊挨著出現(xiàn)在GC log的下面契邀。
三摆寄、安全點(diǎn)是什么
- 從線程的角度,安全點(diǎn)是代碼執(zhí)行中的一些特殊位置坯门,當(dāng)線程執(zhí)行到這些特殊的位置微饥,如果此時在GC,那么在這個地方線程會暫停古戴,直到GC結(jié)束欠橘。
- GC的時候要掛起所有活動的線程,因此線程掛起现恼,會選擇在到達(dá)安全點(diǎn)的時候掛起肃续。
- 安全點(diǎn)這個特殊的位置保存了線程上下文的全部信息黍檩。說白了,在進(jìn)入安全點(diǎn)的時候打印日志信息能看出線程此刻都在干嘛始锚。
有關(guān)安全點(diǎn)的詳細(xì)說明刽酱,請移步:
JVM源碼分析之安全點(diǎn)safepoint
[Java JVM] Hotspot GC研究- GC安全點(diǎn) (Safepoint&Stop The World)
四、什么是STW
等待所有用戶線程進(jìn)入安全點(diǎn)后并阻塞瞧捌,做一些全局性操作的行為棵里。
五、什么時候會STW察郁?(換句話說什么時候會觸發(fā)進(jìn)入安全點(diǎn)衍慎?)
- Garbage collection pauses(垃圾回收)
- JIT相關(guān),比如Code deoptimization, Flushing code cache
- Class redefinition (e.g. javaagent皮钠,AOP代碼植入的產(chǎn)生的instrumentation)
- Biased lock revocation 取消偏向鎖
- Various debug operation (e.g. thread dump or deadlock check) dump 線程
六稳捆、STW的說明
配置 -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1 參數(shù),虛擬機(jī)會打印如下日志文件:
-XX:+PrintSafepointStatistics麦轰,打印安全點(diǎn)統(tǒng)計信息乔夯,
-XX:PrintSafepointStatisticsCount=n設(shè)置打印安全點(diǎn)統(tǒng)計信息的次數(shù);
6.1 日志分析:
- vmop:引發(fā)STW的原因款侵,以及觸發(fā)時間末荐,本例中是GC。該項(xiàng)常見的輸出有:<u>RevokeBias新锈、BulkRevokeBias甲脏、Deoptimize、G1IncCollectionPause</u>妹笆。數(shù)字306936.812是虛擬機(jī)啟動后運(yùn)行的秒數(shù)块请。GC log可以根據(jù)該項(xiàng)內(nèi)容定位Total time for which application threads…引發(fā)的詳細(xì)信息。
- total :STW發(fā)生時拳缠,JVM存在的線程數(shù)目墩新。
- initially_running :STW發(fā)生時,仍在運(yùn)行的線程數(shù)窟坐,這項(xiàng)是Spin階段的 時間來源
- **wait_to_block : **STW需要阻塞的線程數(shù)目海渊,這項(xiàng)是block階段的時間來源
- sync = spin + block + 其他。
6.2 由日志可以看出哲鸳,safepoint的執(zhí)行分為四個階段:
- Spin階段臣疑。因?yàn)閖vm在決定進(jìn)入全局safepoint的時候,有的線程在安全點(diǎn)上徙菠,而有的線程不在安全點(diǎn)上朝捆,這個階段是等待未在安全點(diǎn)上的用戶線程進(jìn)入安全點(diǎn)。
- Block階段懒豹。即使進(jìn)入safepoint芙盘,用戶線程這時候仍然是running狀態(tài),保證用戶不在繼續(xù)執(zhí)行脸秽,需要將用戶線程阻塞儒老。
- Cleanup。這個階段是JVM做的一些內(nèi)部的清理工作记餐。
- VM Operation. JVM 執(zhí)行的一些全局性工作驮樊,例如 GC, 代碼反優(yōu)化。
6.3 vmop 輸出說明
RevokeBias片酝、BulkRevokeBias囚衔、偏向鎖取消情況。
Deoptimize雕沿、
G1IncCollectionPause GC GC 執(zhí)行情況练湿。
6.3 優(yōu)化說明
分析 -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1 產(chǎn)生的日志信息基本上STW的原因都是RevokeBias或者BulkRevokeBias。這個是撤銷偏向鎖操作审轮,雖然每次暫停的 時間很短肥哎,但是特別頻繁出現(xiàn)也會很耗時。
一些高并發(fā)的系統(tǒng)中疾渣,禁掉JVM偏向鎖優(yōu)化篡诽,可以提升系統(tǒng)的吞吐量。禁用偏向鎖的參數(shù)為: -XX:-UseBiasedLocking
七榴捡、引起長時間STW原因
- Full GC
- RevokeBias 撤銷偏向鎖操作也會消耗很長時間杈女。在高并發(fā)系統(tǒng)中,建議禁用偏向鎖吊圾。
- 目前就知道以上2個原因达椰。
八、參考
R大分析類似情況
調(diào)優(yōu)建議
各種JVM參數(shù)說明
stw分析
R大的博客
安全點(diǎn) stw說明
偏向鎖