今天分享的參數(shù)是 -XX:ParGCCardsPerStrideChunk
diagnostic(intx, ParGCCardsPerStrideChunk, 256, \
"The number of cards in each chunk of the parallel chunks used during card table scanning")
一個神奇的參數(shù)婶熬,看描述似乎還是比較迷糊议谷,還是展開來說下。
發(fā)生young gc時丛忆,有一個特殊的GC Roots逗栽,那就是old gen中的對象盖袭,當old gen的對象A引用了young gen的對象B,那么對象B是不能被回收的彼宠。
所以要在old gen中找出所有和對象A類似的對象(引用了young gen對象)鳄虱,怎么找呢?最暴力的辦法就是遍歷所有的old gen對象凭峡,顯然這種方式效率很低下拙已,在HotSpot實現(xiàn)中,提供了一種叫CardTable的數(shù)據(jù)結(jié)構(gòu)摧冀,用來表示一塊內(nèi)存區(qū)域倍踪,一般是512字節(jié),如果這塊內(nèi)存中有對象引用了young gen對象索昂,那么就標識這個CardTable為Dirty的建车,這樣在內(nèi)存掃描時,只需要掃描標識為Dirty的內(nèi)存區(qū)域中的對象即可椒惨,避免了全old gen的掃描缤至,大大提升了掃描效率。
在ParNew算法中康谆,掃描old gen的CardTable由多個線程完成领斥,其中ParGCCardsPerStrideChunk
參數(shù)就是每個線程處理的CardTable數(shù)量,默認是256個沃暗,意思每個線程每次處理大小為 256*512byte = 128K的StrideChunk月洛,如果old gen大小4G,那么一共要處理 4G / 128K = 32K個StrideChunk描睦,這么多的StrideChunk要分配給GC線程膊存,假設(shè)有4個線程在并發(fā)執(zhí)行导而,必然存在任務(wù)的調(diào)度和分配問題忱叭,影響到掃描效率隔崎。
如果把這個參數(shù)調(diào)大,那么每個線程每次處理的StrideChunk也相應(yīng)變大韵丑,總的StrideChunk個數(shù)相應(yīng)的減少爵卒,GC線程在不同的StrideChunk切換次數(shù)也會減少,這樣是不是可以提升一點性能呢撵彻?
那么應(yīng)該調(diào)到多大呢钓株?之前看過一篇LinkedIn的Engineering Blog,他們在不同的配置下經(jīng)過測試之后得出了32768是最佳值的結(jié)論陌僵,后來很多的人覺得這個值很神奇轴合,不假思索的也設(shè)置了這個值,但這個值真的適合你的應(yīng)用么碗短?這個非常值得懷疑受葛。
之后Twitter的一批人也高了一個OpenJDK的測試,他們發(fā)現(xiàn)8192是一個合適的值偎谁,公說公有理总滩,婆說婆有理,我們不用太較真巡雨,抱著學(xué)習(xí)的心態(tài)就行闰渔。
最后,我們看看這個參數(shù)的提交者怎么說铐望,一個俄國人Alexey Ragozin冈涧,這是他的一篇關(guān)于該參數(shù)的文章,傳送門正蛙,他在發(fā)現(xiàn)CardTable掃描時的效率問題后炕舵,在7u40時patch了這個問題,在他的實驗中跟畅,對28G和14G分別咽筋,且該參數(shù)設(shè)置成4K,結(jié)果如下:
不管怎么說徊件,在他的實驗中奸攻,GC性能確實提升不少,但也不能說明4K就是一個完美值虱痕,該值也只是非常符合他當前的實驗而已睹耐。
仔細想想,如果old gen中需要掃描的CardTable其實不多部翘,如果盲目的增大該參數(shù)硝训,也會得不償失,這時256未嘗不是一個合適的值,需要找到一個平衡點窖梁。
因為該參數(shù)是diagnostic類型的赘风,所以要使修改的值生效,需要添加下面參數(shù):
-XX:+UnlockDiagnosticVMOptions
-XX:ParGCCardsPerStrideChunk=4096
花了這么長時間來解釋這個參數(shù)纵刘,只是像說明一點邀窃,在JVM調(diào)優(yōu)過程中,沒有一個參數(shù)的值完美的假哎,只有經(jīng)過不斷的調(diào)優(yōu)過程瞬捕,慢慢的摸索到適合自己應(yīng)用的最佳參數(shù)范圍,除非應(yīng)用對YGC的耗時特別敏感舵抹,不到萬不得已肪虎,不用優(yōu)化該參數(shù),256也適合大部分情況惧蛹。但是隨著現(xiàn)在機器內(nèi)存的擴大笋轨,適當?shù)脑龃笤搮?shù)值(4K),也是沒有問題的赊淑。
我是占小狼爵政,如果覺得有收獲,歡迎關(guān)注陶缺。