Java并行GC的使用和調(diào)優(yōu)
并行垃圾收集器(Parallel GC、并行GC)是在多核CPU環(huán)境下的一種JVM垃圾收集算法,它可以在多個(gè)線程內(nèi)并行執(zhí)行垃圾收集功能,從而減少長時(shí)間GC對(duì)應(yīng)用系統(tǒng)造成的影響。
下面主要介紹關(guān)于并行GC的使用和調(diào)優(yōu)相關(guān)內(nèi)容。
在什么時(shí)候使用并行GC
如果應(yīng)用存在以下要求,那么就可以考慮使用Parallel GC:
- 側(cè)重吞吐量:如果應(yīng)用程序?qū)κ聞?wù)吞吐量要求很高,并且可以容忍長時(shí)間執(zhí)行垃圾收集,那么并行GC可能就是一個(gè)合適的選擇。它主要通過允許垃圾收集與應(yīng)用程序執(zhí)行同時(shí)執(zhí)行來優(yōu)化吞吐量。
- 批量處理任務(wù):應(yīng)用程序如果涉及到批處理或者數(shù)據(jù)分析的任務(wù),可以考慮使用并行GC。這些類型的應(yīng)用程序經(jīng)常執(zhí)行大量的計(jì)算,并行GC有助于最小化垃圾收集過程對(duì)應(yīng)用程序總體處理時(shí)間產(chǎn)生的影響。
- 中等以上堆內(nèi)存:并行GC非常適合具有中等堆到較大堆的應(yīng)用程序。如果應(yīng)用程序需要大量堆來滿足其內(nèi)存需求,并行GC可以有效地管理內(nèi)存并減少垃圾收集對(duì)應(yīng)用程序的影響。
如何配置啟用并行GC
可以在啟動(dòng)Java應(yīng)用程序時(shí)傳遞以下參數(shù),以啟動(dòng)并行GC(Parallel GC):
-XX:+UseParallelGC
這個(gè)JVM參數(shù)指的是JVM使用并行GC算法進(jìn)行垃圾收集。但需要注意的是,在Java 8之前的JVM版本,不需要顯式地指定垃圾收集算法,所有服務(wù)類JVM的默認(rèn)垃圾收集器都是ParallelGC。
在Java 并行GC調(diào)優(yōu)方面,下面介紹幾個(gè)用于控制垃圾收集過程的關(guān)鍵JVM參數(shù)。包括:Heap和generation的大小參數(shù)、GC吞吐量相關(guān)參數(shù)、其他參數(shù)。
1.Heap和generation的大小參數(shù)
并行GC的調(diào)優(yōu)涉及到整個(gè)堆的大小與年輕代和老代的大小之間的平衡。雖然較大的堆通常會(huì)提高吞吐量,但它也會(huì)導(dǎo)致執(zhí)行GC期間消耗更長的時(shí)間。因此,找到“堆”和“代”的最佳大小至關(guān)重要。下面這些JVM參數(shù)支持調(diào)整堆大小和生成大小,以實(shí)現(xiàn)最佳GC配置。
(1) -Xmx
-Xmx
這個(gè)參數(shù)設(shè)置了最大堆大小,它設(shè)置了內(nèi)存分配的上限。通過仔細(xì)評(píng)估并選擇恰當(dāng)?shù)?Xmx值,可以控制整個(gè)堆的大小使得應(yīng)用程序的可用內(nèi)存和GC性能之間更加平衡。
(2) -XX:NewSize 、-XX:MaxNewSize、-XX:NewRatio
-XX:NewSize
-XX:MaxNewSize
-XX:NewRatio
這幾個(gè)參數(shù)決定了分配新對(duì)象的Young Generation的大小。-XX:NewSize設(shè)置初始大小,而-XX:MaxNewSize用于控制內(nèi)存上限,-XX:NewRatio用于配置年輕代和終身代之間的比率。通過這些值可以微調(diào)年輕代的大小和比例。
(3) -XX:YoungGenerationSizeIncrement
-XX:TenuredGenerationSizeIncrement
-XX:YoungGenerationSizeIncrement
-XX:TenuredGenerationSizeIncrement
這兩個(gè)參數(shù)分別定義了年輕代和持久代的內(nèi)存增量大小。年輕代和持久代的大小增量是內(nèi)存分配和垃圾收集行為中的關(guān)鍵因素。增長和收縮是以不同的速度進(jìn)行的。默認(rèn)情況下以20%的增量增長,以5%的增量收縮。增長的百分比由參數(shù)-XX:YoungGeneratinotallow=<Y>和-XX:TenuredGeneratinotallow=<T>進(jìn)行配置。
(4) -XX:AdaptiveSizeDecrementScaleFactor
-XX:AdaptiveSizeDecrementScaleFactor
這個(gè)參數(shù)用于設(shè)置在收縮期間遞減的比例因子。根據(jù)參數(shù)-XX:AdaptiveSizeDecrementScaleFactor=<D>調(diào)整收縮的比例。如果增長增量為X%,則收縮的減少量為X/D%。
2.GC吞吐量相關(guān)的參數(shù)調(diào)優(yōu)
為了實(shí)現(xiàn)垃圾收集最佳性能,控制GC暫停時(shí)間和優(yōu)化GC吞吐量至關(guān)重要,GC吞吐量一般用“專門用于垃圾收集的時(shí)間量”與“應(yīng)用程序執(zhí)行時(shí)間量”的比例表示。以下是幾個(gè)基于GC吞吐量的調(diào)優(yōu)參數(shù)。
(1) -XX:MaxGCPauseMillis
-XX:MaxGCPauseMillis
這個(gè)參數(shù)允許開發(fā)人員指定垃圾收集所需的最大暫停時(shí)間(以毫秒為單位)。通過設(shè)置一個(gè)適當(dāng)?shù)闹担_發(fā)人員可以調(diào)節(jié)GC暫停的時(shí)長,確保在可接受的范圍內(nèi)。
(2) -XX:GCTimeRatio
-XX:GCTimeRatio
這個(gè)參數(shù)使用公式1 /(1 + N)設(shè)置垃圾收集時(shí)間與應(yīng)用程序時(shí)間的比率,其中N是正整數(shù)值。目的是定義垃圾收集所需的時(shí)間與應(yīng)用程序執(zhí)行時(shí)間的占比,以優(yōu)化GC吞吐量。例如,-XX:GCTimeRatio=19。使用該配置的目標(biāo)是將總應(yīng)用程序執(zhí)行時(shí)間的1/20或5%分配給垃圾收集。這意味著對(duì)于每20個(gè)時(shí)間單位(毫秒),在垃圾收集和應(yīng)用執(zhí)行總體時(shí)間的大約19毫秒中,大約有1個(gè)時(shí)間單位的時(shí)間將被分配給垃圾收集過程,而剩余的19個(gè)時(shí)間單位將專門用于應(yīng)用的執(zhí)行。這個(gè)參數(shù)默認(rèn)值為99,意味著垃圾收集的目標(biāo)時(shí)間為1%。
(3) -XX:GCTimePercentage
-XX:GCTimePercentage
這個(gè)參數(shù)更加直接,開發(fā)人員可以通過這個(gè)參數(shù)直接分配垃圾收集的時(shí)間與應(yīng)用執(zhí)行時(shí)間的期望百分比(GC吞吐量)。例如:設(shè)置“-XX:GCTimePercentage=5”表示分配總時(shí)間的5%用于垃圾收集,剩余的95%用于應(yīng)用程序執(zhí)行。
總之,‘-XX:GCTimeRatio‘或‘-XX:GCTimePercentage‘這兩個(gè)參數(shù)都可以靈活地表示垃圾收集所需的時(shí)間。相比之下,使用“-XX:GCTimePercentage”比“-XX:GCTimeRatio”更加好理解。
3.其他參數(shù)
除前面幾個(gè)JVM參數(shù)之外,還有一些其他參數(shù)也可用于調(diào)優(yōu)并行GC算法的性能。
(1) -XX:ParallelGCThreads
-XX:ParallelGCThreads
這個(gè)參數(shù)允許開發(fā)人員指定并行GC算法中用于垃圾收集的線程數(shù)。通過基于當(dāng)前CPU可用的內(nèi)核數(shù)設(shè)置適當(dāng)?shù)闹担浞掷枚嗪讼到y(tǒng)的處理能力來優(yōu)化吞吐量。線程太少或太多都不利于資源平衡,都可能導(dǎo)致性能不佳。
(2) -XX:-UseAdaptiveSizePolicy
-XX:-UseAdaptiveSizePolicy
這個(gè)參數(shù)允許根據(jù)應(yīng)用程序?qū)?nèi)存的需求動(dòng)態(tài)調(diào)整年輕代和老年代的大小。默認(rèn)情況下,“UseAdaptiveSizePolicy”處于啟用狀態(tài)。
啟用:-XX:+UseAdaptiveSizePolicy
關(guān)閉:-XX:-UseAdaptiveSizePolicy
然而,默認(rèn)情況下這個(gè)參數(shù)會(huì)根據(jù)應(yīng)用程序?qū)?nèi)存的需求動(dòng)態(tài)調(diào)整年輕代和老年代的大小。動(dòng)態(tài)調(diào)整可能導(dǎo)致頻繁的“Full GC”,增加了GC時(shí)間。為了減少這類問題,我們可以通過設(shè)置-XX:-UseAdaptiveSizePolicy參數(shù)來禁用它,并減少GC時(shí)間。
執(zhí)行并行GC調(diào)優(yōu)
如果需要了解并行GC的性能,最好的方式是通過分析GC日志。GC日志包含了垃圾收集事件、內(nèi)存使用情況以及其他相關(guān)的指標(biāo)詳細(xì)信息。
以下幾個(gè)工具可以幫助分析GC日志:
- GCey
- IBM GC
- Memory Visualizer
- HP Jmeter
- Google Garbage Cat
通過使用這些工具,可以讓內(nèi)存的分配更加直觀,能夠識(shí)別潛在的瓶頸,并評(píng)估垃圾收集的效率。為并行GC的調(diào)優(yōu)提供依據(jù)。
總之
通過調(diào)整堆的大小、代的大小和GC吞吐量相關(guān)參數(shù)等,可以優(yōu)化垃圾收集過程,最大限度地提高內(nèi)存利用率,最大限度地減少GC時(shí)長,提高Java應(yīng)用程序的垃圾收集并效率,并釋放Java應(yīng)用程序的潛力。另外,對(duì)應(yīng)用程序執(zhí)行過程進(jìn)行持續(xù)監(jiān)控、分析和優(yōu)化,是保持應(yīng)用程序處于最佳性能的重要訣竅。