溫馨提示×

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

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

如何實(shí)現(xiàn)JVM調(diào)優(yōu)

發(fā)布時(shí)間:2021-10-12 14:05:12 來(lái)源:億速云 閱讀:143 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“如何實(shí)現(xiàn)JVM調(diào)優(yōu)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何實(shí)現(xiàn)JVM調(diào)優(yōu)”吧!

我把堆區(qū)的主要結(jié)構(gòu)以及參數(shù)放在下面,這樣可以參照著圖來(lái)看:

如何實(shí)現(xiàn)JVM調(diào)優(yōu)

一、如何設(shè)置最大年齡

每發(fā)生一次Young  GC,就會(huì)將Eden區(qū)和當(dāng)前的Survivor區(qū)的存活對(duì)象一次性地轉(zhuǎn)入到另外一個(gè)Survivor區(qū)中,并將之前的Eden區(qū)以及Survivor區(qū)清空。所以年輕代的存活對(duì)象,基本上就是在兩塊Survivor區(qū)中換來(lái)?yè)Q去,每換一次,年齡增加1歲。當(dāng)?shù)竭_(dá)最大年齡時(shí)(最大年齡由-XX:MaxTenuringThreshold參數(shù)設(shè)置,默認(rèn)15歲),就會(huì)被轉(zhuǎn)移進(jìn)老年代。

現(xiàn)在有這樣的一個(gè)場(chǎng)景,8歲的對(duì)象有1000個(gè),過(guò)了一段時(shí)間后,15歲的對(duì)象有900個(gè)??梢杂^察到,在8歲后,有90%的對(duì)象達(dá)到了默認(rèn)的最大年齡,這些對(duì)象不停地在兩個(gè)Survivor區(qū)中換來(lái)?yè)Q去,無(wú)疑增加了復(fù)制成本。因此,在這種情況下,我們大可以將最大年齡設(shè)置為8歲,達(dá)到8歲的對(duì)象,直接轉(zhuǎn)移至老年代,避免多次重復(fù)復(fù)制與浪費(fèi)新生代空間。

二、Young GC頻繁怎么辦?

我們使用jstat -gcutil {pid} 1000,即每秒打印出GC的統(tǒng)計(jì)信息,其中YGC代表Young GC  發(fā)生的總次數(shù)。每秒刷新一次統(tǒng)計(jì)信息,如果此時(shí)發(fā)現(xiàn)YGC增加得很頻繁,比如一秒一次Young GC。

Young  GC頻繁,代表著新對(duì)象的創(chuàng)建速度與新生代大小不匹配,要么是代碼中頻繁創(chuàng)建對(duì)象,要么就是新生代的空間太小。排查代碼是有必要的,但卻非常耗時(shí)。那么這一次,我們主要從調(diào)整新生代大小的方案入手。

我們大可以將新生代區(qū)增加為1.5倍(為什么是1.5倍,這只是一個(gè)試探的倍數(shù))。如果之前Young  GC的每隔1000ms發(fā)生一次,那么理論上現(xiàn)在的Young GC的發(fā)生間隔在1500ms左右,頻率有所降低,但是會(huì)不會(huì)導(dǎo)致每次Young  GC的耗時(shí)增加為原來(lái)的1.5倍呢?

答案是不會(huì)的

Young  GC主要是對(duì)新生代進(jìn)行清理,首先對(duì)Eden區(qū)和一塊Survivor區(qū)的存活對(duì)象進(jìn)行標(biāo)記,然后一起復(fù)制另外一塊Survivor區(qū)中,最后直接清理Eden區(qū)和之前的Survivor區(qū)??梢?jiàn),這里耗時(shí)最嚴(yán)重的環(huán)節(jié)是復(fù)制操作。

大概98%的對(duì)象都是在幾毫秒內(nèi)死亡,即使將新生代擴(kuò)充為原來(lái)的1.5倍,那么當(dāng)下一次Young  GC到來(lái)時(shí),復(fù)制的對(duì)象總數(shù)遠(yuǎn)小于之前的1.5倍,可能只是比之前多一點(diǎn)點(diǎn),比如是1.15倍。

因此,將新生代擴(kuò)容至原來(lái)的1.5倍,理論上,掃描新生代的時(shí)間將會(huì)變?yōu)樵瓉?lái)的1.5倍,標(biāo)記時(shí)間在[1,1.5)倍內(nèi),復(fù)制時(shí)間在[1,1.5)倍內(nèi),且這兩個(gè)時(shí)間遠(yuǎn)小于1.5倍。對(duì)于虛擬機(jī)來(lái)說(shuō),復(fù)制的消耗成本遠(yuǎn)大于掃描與標(biāo)記操作。因此,擴(kuò)容新生代后,Young  GC不會(huì)顯著地按照線性增長(zhǎng)。

如果保持整個(gè)堆的大小不變,那么擴(kuò)容新生代后,勢(shì)必會(huì)壓縮老年代的空間,Major  GC的頻率可能會(huì)增加。所以,還是需要找到一個(gè)臨界點(diǎn),在能夠大幅度下降Young GC的頻率時(shí),且只在小幅度內(nèi)增加Major GC的頻率。

感謝各位的閱讀,以上就是“如何實(shí)現(xiàn)JVM調(diào)優(yōu)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何實(shí)現(xiàn)JVM調(diào)優(yōu)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向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