JVM之GC日志續(xù)

需求三天改,加班一月長(zhǎng),
家人不相見(jiàn),怒刷進(jìn)度墻。 
奮斗需牢記,調(diào)薪語(yǔ)不詳,
此中辛酸淚,誤識(shí)譚浩強(qiáng)。

本文大概闡述和GC日志相關(guān)的jvm啟動(dòng)參數(shù)的一些內(nèi)容。

GC日志相關(guān)基本參數(shù)

-XX:+PrintGCDetails
  輸出GC的詳細(xì)日志
-XX:+PrintGCTimeStamps
  輸出GC的時(shí)間戳(以基準(zhǔn)時(shí)間的形式)
-XX:+PrintGCDateStamps
  輸出GC的時(shí)間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC
  在進(jìn)行GC的前后打印出堆的信息
-XX:+PrintGCApplicationStoppedTime
  輸出GC造成應(yīng)用暫停的時(shí)間
-XX:+PrintReferenceGC
  引用相關(guān)信息,虛、弱、強(qiáng)引用的個(gè)數(shù)和耗時(shí)
-Xloggc:../logs/gc.log
  日志文件的輸出路徑

特殊說(shuō)明:生產(chǎn)環(huán)境gc日志要遵循夠用就好的原則,因?yàn)間c日志的時(shí)間也是會(huì)算在stw時(shí)間里的,如果gc日志的輸出是同步刷盤(pán)模式,有可能會(huì)因?yàn)橄到y(tǒng)其他IO異常造成gc停頓時(shí)間的異常(由于gc打印造成的異常我們下一篇再詳細(xì)介紹下)

GC日志相關(guān)特殊參數(shù)

1. GC日志滾動(dòng)

-XX:+UseGCLogFileRotation

GC日志的輸出會(huì)發(fā)生文件IO,有時(shí)候也會(huì)造成不必要的停頓,可以將GC日志輸出到tmpfs(內(nèi)存文件系統(tǒng))中,但tmpfs會(huì)消耗內(nèi)存,為了避免內(nèi)存被浪費(fèi)可以使用-XX:+UseGCLogFileRotation滾動(dòng)GC日志。

2. 禁寫(xiě)Statistics數(shù)據(jù)

-XX:+PerfDisableSharedMem

gstst會(huì)默默的在/tmp/hperf 目錄寫(xiě)上一點(diǎn)statistics數(shù)據(jù)。
如果gc時(shí),剛好遇到PageCache刷盤(pán),把文件阻塞了,就不能結(jié)束這個(gè)Stop the World的安全點(diǎn)了。用上述參數(shù)禁用jstat,用jmx來(lái)代替即可。參見(jiàn):jvm-mmap-pause

3. 安全點(diǎn)相關(guān)參數(shù)

-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount = 1

安全點(diǎn)相關(guān)日志輸出如下:

vmop[threads: total initially_running wait_to_block][time: spin block sync cleanup vmop]page_trap_count
0.257: ParallelGCFailedAllocation[       9          0              0    ][     0     0     0     0     2    ]  0
0.261: novmoperation[       7          0              1    ][     0     0     0     0     0    ]  0
  • vmop
  • 表示 引發(fā)STW的原因
  • [thread]
  • total:安全點(diǎn)里的總線程數(shù)
  • initially_running:安全點(diǎn)時(shí)開(kāi)始時(shí)正在運(yùn)行狀態(tài)的線程數(shù)
  • wait_to_block:在VM Operation開(kāi)始前需要等待其暫停的線程數(shù)
  • [time]
  • spin:等待線程響應(yīng)safepoint號(hào)召的時(shí)間
  • block:暫停所有線程所用的時(shí)間
  • sync:(spin + block),==從開(kāi)始到進(jìn)入安全點(diǎn)所耗的時(shí)間,可用于判斷進(jìn)入安全點(diǎn)耗時(shí)
  • cleanup:清理所需時(shí)間
  • vmop:真正執(zhí)行VM Operation的時(shí)間

no vm operation 說(shuō)明這里沒(méi)有vm相關(guān)操作發(fā)生,因此表示是一個(gè)安全點(diǎn)
安全點(diǎn)對(duì)系統(tǒng)的健康監(jiān)控是非常重要的。會(huì)使用到安全點(diǎn)的場(chǎng)景有GC、偏向鎖撤銷(xiāo)等,總之是提供一個(gè)對(duì)象狀態(tài)不變的狀態(tài)點(diǎn),去讓系統(tǒng)進(jìn)行一系列的后續(xù)操作。
這里要順便提一下另一個(gè)和安全點(diǎn)相關(guān)的jvm參數(shù):-XX:-UseBiasedLocking
禁用偏向鎖的設(shè)置參數(shù),在有的情況下比較有效,如果并發(fā)競(jìng)爭(zhēng)變大,會(huì)導(dǎo)致偏向鎖撤銷(xiāo)頻繁,這個(gè)時(shí)候我們可能會(huì)看到安全點(diǎn)的耗時(shí)增加,進(jìn)而導(dǎo)致了gc時(shí)間和系統(tǒng)響應(yīng)時(shí)間增大,關(guān)于安全點(diǎn)和偏向鎖的異常案例,我們也放在下一篇一并列舉

補(bǔ):性能和調(diào)優(yōu)相關(guān)特殊參數(shù)

1. dump相關(guān)參數(shù)

這個(gè)應(yīng)該不屬于gc日志相關(guān)參數(shù),但是都在jvm啟動(dòng)參數(shù)里,就順便提下

  • 1.heap dump
-XX:+HeapDumpOnOutOfMemoryError

這個(gè)參數(shù),主要作用是,在系統(tǒng)發(fā)生oom異常時(shí),自動(dòng)進(jìn)行heap dump操作,有些大佬說(shuō)在容器環(huán)境混部情況下,在普通硬盤(pán)上會(huì)造成20秒以上的硬盤(pán)IO跑滿,對(duì)其他宿主程序是很不友好的,但是按生產(chǎn)環(huán)境的實(shí)際運(yùn)營(yíng)情況看,這個(gè)參數(shù)還是非常有用的,在系統(tǒng)發(fā)生oom異常需要盡快重啟恢復(fù)的時(shí)候,dump下來(lái)的現(xiàn)場(chǎng)文件對(duì)異常的排查是非常有幫助的。

  • 2.core dump
ulimit -c unlimited

從CoreDump能夠轉(zhuǎn)出Heap Dump 和 Thread Dump 還有crash的地方,非常實(shí)用

2. Integer Cache

-XX:AutoBoxCacheMax=20000

對(duì)于Integer和 Long,JDK默認(rèn)只緩存 -128 ~ +127,超出范圍的數(shù)字就要實(shí)時(shí)構(gòu)建新的Integer對(duì)象。對(duì)于性能要求很高的系統(tǒng)場(chǎng)景,可以設(shè)置此參數(shù),據(jù)有關(guān)測(cè)算,QPS影響達(dá)4%左右。

3. 啟動(dòng)時(shí)預(yù)訪問(wèn)

-XX:+AlwaysPreTouch

ElasticSearch和Cassandra都設(shè)置了此參數(shù)。作用是內(nèi)存頁(yè)預(yù)訪問(wèn),可能啟動(dòng)時(shí)慢上一點(diǎn),但訪問(wèn)時(shí)會(huì)更快速些,比如新生代晉升到老生代時(shí)不會(huì)臨時(shí)訪問(wèn)頁(yè)面使得GC停頓時(shí)間加長(zhǎng)。

4. 即時(shí)編譯

-XX:-UseCounterDecay
-XX:-TieredCompilation

gc默認(rèn)進(jìn)行技術(shù)器衰減操作,可能會(huì)導(dǎo)致某些臨界訪問(wèn)量的方法,一直無(wú)法轉(zhuǎn)成熱點(diǎn)代碼,所以可以使用UseCounterDecay參數(shù)來(lái)禁用計(jì)數(shù)器衰減操作。TieredCompilation是1.8默認(rèn)開(kāi)啟的多層編譯。但是業(yè)界大佬在實(shí)測(cè)時(shí)發(fā)現(xiàn)啟動(dòng)初期可能有性能減弱,有需要可以將其禁用。

總結(jié)

本篇主要概述了gc日志所涉及到的一些可能需要關(guān)注的參數(shù)設(shè)置,其中提及的一些實(shí)際案例,我們后續(xù)文章補(bǔ)充;也順便列舉了一些和性能相關(guān)的jvm啟動(dòng)參數(shù),在大家平時(shí)有遇到類(lèi)似問(wèn)題可以當(dāng)做個(gè)參考。
當(dāng)然,和gc相關(guān)的jvm啟動(dòng)參數(shù)是非常多的,gc策略、并發(fā)收集線程數(shù)、eden和s區(qū)的比例、對(duì)象年代、cms的碎片壓縮、G1的停頓時(shí)間等等,每一個(gè)都可以結(jié)合實(shí)際需求單獨(dú)一篇來(lái)展開(kāi)闡述。后續(xù)有機(jī)會(huì)再逐一補(bǔ)充吧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容