問題是這樣的。我應該如何爲我的應用程序調整CMS?
我們正在使用CMS並遇到併發模式故障(需要大約15秒)。使用JRE 8.
已使用UseCMSInitiatingOccupancyOnly和CMSInitiatingOccupancyFraction(80%)。不使用CMSScavengeBeforeRemark。
分配模式是這樣的:
大量短期對象的分配。所以我們正在使用一個大的年輕一代,2GB。倖存者空間未調整。 MaxTenuringThreshold設置爲15.每隔幾個小時CMS進入。
老一代是4GB。內存使用率很高。每次收集後,老一代擁有約30%的自由空間。不幸的是沒有更多的可用內存我們計劃修改程序以使其佔用較少的內存,但這需要時間。
通常程序沒有太多的工作要做,但每隔幾個小時(我們無法預測何時)我們真的很忙。而15秒的STW太長了。
所以我的問題是:
我們如何調整我們的程序的CMS?
我應該增加老一代(並減少年輕)嗎?
我應該調整Survivor嗎?
我應該改變CMSInitiatingOccupancyFraction嗎?
G1GC會幫忙嗎?
+ XX:+ UseParallelOldGC?考慮到你有足夠的內核,通常對於小堆來說是更好的選擇。 –
@AlexeyRagozin我們根本不需要STW(除了0.x秒)。如果調優CMS不起作用,我們可能會修改代碼。 – ntysdd
如果您所需要的僅僅是亞秒暫停並且有4GB堆,那麼並行收集器應該能夠做到這一點,前提是您擁有足夠的內核,而不是極其參考繁重的工作負載。 – the8472