溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JVM中GC調(diào)優(yōu)的示例分析

發(fā)布時(shí)間:2021-06-04 10:14:17 來(lái)源:億速云 閱讀:144 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下JVM中GC調(diào)優(yōu)的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

那些GC的默認(rèn)值

其實(shí)GC或者說(shuō)JVM的參數(shù)非常非常的多,有控制內(nèi)存使用的:

JVM中GC調(diào)優(yōu)的示例分析

有控制JIT的:

JVM中GC調(diào)優(yōu)的示例分析

有控制分代比例的,也有控制GC并發(fā)的:

JVM中GC調(diào)優(yōu)的示例分析

當(dāng)然,大部分的參數(shù)其實(shí)并不需要我們自行去調(diào)整,JVM會(huì)很好的動(dòng)態(tài)幫我們?cè)O(shè)置這些變量的值。

如果我們不去設(shè)置這些值,那么對(duì)GC性能比較有影響的參數(shù)和他們的默認(rèn)值有哪些呢?

GC的選擇

我們知道JVM中的GC有很多種,不同的GC選擇對(duì)java程序的性能影響還是比較大的。

在JDK9之后,G1已經(jīng)是默認(rèn)的垃圾回收器了。

JVM中GC調(diào)優(yōu)的示例分析

我們看一下G1的調(diào)優(yōu)參數(shù)。

G1是基于分代技術(shù)的,其實(shí)JVM還在開(kāi)發(fā)一些不再基于分代技術(shù)的GC算法,比如ZGC,我們可以根據(jù)需要來(lái)選擇適合我們的GC算法。

GC的最大線程個(gè)數(shù)

GC是由專門的GC線程來(lái)執(zhí)行的,并不是說(shuō)GC線程越多越好,這個(gè)默認(rèn)線程的最大值是由heap size和可用的CPU資源動(dòng)態(tài)決定的。

當(dāng)然你可以使用下面兩個(gè)選項(xiàng)來(lái)修改GC的線程:

 -XX:ParallelGCThreads=threads 設(shè)置STW的垃圾收集線程數(shù)


 -XX:ConcGCThreads = n 設(shè)置并行標(biāo)記線程的數(shù)量

一般情況下ConcGCThreads可以設(shè)置為ParallelGCThreads的1/4。

初始化heap size

默認(rèn)情況下加初始化的heap size是物理內(nèi)存的1/64。

你可以使用

 -XX:InitialHeapSize=size

來(lái)重新設(shè)置。

最大的heap size

默認(rèn)情況下最大的heap size是物理內(nèi)存的1/4。

你可以使用:

-XX:MaxHeapSize

來(lái)重新設(shè)置。

分層編譯技術(shù)

默認(rèn)情況下分層編譯技術(shù)是開(kāi)啟的。你可以使用:

-XX:-TieredCompilation

來(lái)關(guān)閉分層編譯。如果啟用了分層編譯,那么可能需要關(guān)注JIT中的C1和C2編譯器帶來(lái)的影響。

我們到底要什么

java程序在運(yùn)行過(guò)程中,會(huì)發(fā)生很多次GC,那么我們其實(shí)是有兩種統(tǒng)計(jì)口徑:

1.平均每次GC執(zhí)行導(dǎo)致程序暫停的時(shí)間(Maximum Pause-Time Goal)。

2.總的花費(fèi)在GC上的時(shí)間和應(yīng)用執(zhí)行時(shí)間的比例(Throughput Goal)。

最大暫停時(shí)間

單次GC的暫停時(shí)間是一個(gè)統(tǒng)計(jì)平均值,因?yàn)閱未蜧C的時(shí)間其實(shí)是不可控的,但是取了平均值,GC就可以動(dòng)態(tài)去調(diào)整heap的大小,或者其他的一些GC參數(shù),從而保證每次GC的時(shí)間不會(huì)超過(guò)這個(gè)平均值。

我們可以通過(guò)設(shè)置:

-XX:MaxGCPauseMillis=<nnn>

來(lái)控制這個(gè)值。

不管怎么設(shè)置這個(gè)參數(shù),總體需要被GC的對(duì)象肯定是固定的,如果單次GC暫停時(shí)間比較短,可能會(huì)需要減少heap size的大小,那么回收的對(duì)象也比較少。這樣就會(huì)導(dǎo)致GC的頻率增加。從而導(dǎo)致GC的總時(shí)間增加,影響程序的Throughput。

吞吐率

吞吐率是由花費(fèi)在GC上的時(shí)間和應(yīng)用程序上的時(shí)間比率來(lái)決定的。

我們可以通過(guò)設(shè)置:

-XX:GCTimeRatio=nnn

來(lái)控制。

如果沒(méi)有達(dá)到throughput的目標(biāo),那么GC可能會(huì)去增加heap size,從而減少GC的執(zhí)行頻率。但是這樣會(huì)增加單次的Maximum Pause-Time。

如果throughput和maximum pause-time的參數(shù)同時(shí)都設(shè)置的話,JVM會(huì)去嘗試去動(dòng)態(tài)減少heap size的大小,直到其中的一個(gè)目標(biāo)不能滿足為止。

看完了這篇文章,相信你對(duì)“JVM中GC調(diào)優(yōu)的示例分析”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI