溫馨提示×

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

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

JVM中垃圾回收機(jī)制的示例分析

發(fā)布時(shí)間:2022-03-03 14:31:37 來(lái)源:億速云 閱讀:144 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了JVM中垃圾回收機(jī)制的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    堆內(nèi)存的劃分

    分為三個(gè)部分(以下名詞表示同一個(gè)區(qū)):

    • 新生區(qū)、新生代、年輕代

    • 養(yǎng)老區(qū)、老年區(qū)、老年代

    • 永久區(qū)、永久代

    JVM中垃圾回收機(jī)制的示例分析

    劃分區(qū)域的目的

    唯一目的就是優(yōu)化GC性能。

    如果沒(méi)有分代,我們所有的對(duì)象都放在一塊,GC的時(shí)候我們需要對(duì)堆的所有區(qū)域進(jìn)行掃描。而很多的對(duì)象都是“朝生夕死”的,如果把創(chuàng)建的新的對(duì)象都放在某一地方,當(dāng)GC的時(shí)候就先把“朝生夕死”對(duì)象的區(qū)域進(jìn)行回收,這樣就會(huì)騰出很多大的空間來(lái)。

    一、新生區(qū)的垃圾回收機(jī)制

    新生區(qū)分為:Eden區(qū)、Survivor0區(qū)、Survivor1區(qū)(也稱(chēng)為from區(qū)和to區(qū))
    其中Eden區(qū)占80%的內(nèi)存空間,每塊Survivor各占用10%的內(nèi)存空間(如:Eden占800M,每個(gè)Survivor占100M)

    1.開(kāi)始時(shí)創(chuàng)建的對(duì)象都是分配在Eden區(qū)域中,當(dāng)Eden區(qū)快滿(mǎn)了,就會(huì)觸發(fā)垃圾回收Minor GC(使用復(fù)制算法進(jìn)行垃圾回收)

    JVM中垃圾回收機(jī)制的示例分析

    2.Minor GC處理后,首先會(huì)把Eden區(qū)中還存活著的對(duì)象一次性轉(zhuǎn)入其中一塊空閑著的Survivor區(qū)。然后清空Eden區(qū),之后創(chuàng)建的對(duì)象就繼續(xù)放入Eden區(qū)中了,直至下次Eden又被填滿(mǎn)。

    JVM中垃圾回收機(jī)制的示例分析

    3.Eden再次被填滿(mǎn)時(shí),就會(huì)再次出發(fā)Minor GC,清理后(Minor會(huì)清理Eden區(qū)和Survivor區(qū)的內(nèi)存),Eden區(qū)和存在對(duì)象的Survivor區(qū)(此時(shí)的from區(qū))中存活的對(duì)象轉(zhuǎn)移到另一塊空著的Survivor區(qū)中(此時(shí)的to區(qū)),并清空Eden區(qū)和之前存在對(duì)象的Survivor區(qū)(此時(shí)變?yōu)閠o區(qū)了,“From”和“To”會(huì)交換他們的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。)

    這就是復(fù)制算法的流程。
    一直要保持一個(gè)Survivor區(qū)是空的以提供復(fù)制算法垃圾回收,而這塊區(qū)域的內(nèi)存只占整塊的10%,其他90%內(nèi)存都可以被使用,課件內(nèi)存利用率還是相當(dāng)高的。

    二、什么時(shí)候進(jìn)入老年區(qū)呢?

    1 經(jīng)歷15次GC后進(jìn)入老年區(qū)

    默認(rèn)情況下,如果新生區(qū)中的某個(gè)對(duì)象經(jīng)歷了15次GC后,還是沒(méi)有被回收掉,那么它就會(huì)被轉(zhuǎn)入老年區(qū)。
    可通過(guò)JVM參數(shù)“-XX:MaxTenuringThreshold”來(lái)設(shè)置,默認(rèn)是15。

    2 動(dòng)態(tài)對(duì)象年齡判斷

    這種方法不用等到經(jīng)歷GC15次。
    假如一批對(duì)象總大小大于當(dāng)前Survivor區(qū)內(nèi)存的50%,那么大于等于這批對(duì)象年齡的對(duì)象就會(huì)被轉(zhuǎn)移到老年區(qū)。

    例:假設(shè)Survivor0區(qū)中的兩個(gè)對(duì)象都經(jīng)歷的3次GC(年齡3),而且這兩個(gè)對(duì)象總大小50M,超過(guò)了Survivor0區(qū)內(nèi)存大小的一半。那么此時(shí)Survivor0區(qū)中年齡大于等于3歲的對(duì)象就都要被全部轉(zhuǎn)移到老年區(qū)。

    JVM中垃圾回收機(jī)制的示例分析

    3 大對(duì)象直接進(jìn)入老年代

    有一個(gè)JVM參數(shù)"-XX:PretenureSizeThreshold",默認(rèn)值是0,表示任何情況都先把對(duì)象分配給Eden區(qū)。
    若設(shè)置為1048576字節(jié),也就是1M。則表示當(dāng)創(chuàng)建的對(duì)象大于1M時(shí),就會(huì)直接把這個(gè)對(duì)象放入到老年區(qū),就根本不會(huì)經(jīng)過(guò)新生區(qū)了。
    這么做的原因:大對(duì)象在經(jīng)歷復(fù)制算法進(jìn)行GC的時(shí)候會(huì)降低性能。

    4 Minor GC后存活的對(duì)象太多無(wú)法放入Survivor區(qū)了

    Minor GC后存活的對(duì)象太多,導(dǎo)致Survivor區(qū)放不下了,此時(shí)就會(huì)將所有的對(duì)象直接轉(zhuǎn)移到老年區(qū)中。

    三、老年區(qū)空間分配擔(dān)保原則

    執(zhí)行每一次Minor GC前,JVM都先檢查一下老年區(qū)可用的內(nèi)存空間是否大于新生區(qū)所有對(duì)象的總大小。

    原因:極端情況下,Minor GC后,新生代中所有的對(duì)象都活了下來(lái),那就會(huì)把所有新生代中的對(duì)象放入老年區(qū)中。

    • 如果說(shuō)老年區(qū)可用內(nèi)存大于新生代對(duì)象總大小,那么就可以放心的執(zhí)行Minor GC。

    • 但如果老年區(qū)內(nèi)存小于新生區(qū)對(duì)象的總大小,這時(shí)候就會(huì)看一個(gè)參數(shù):“-XX:HandlePromotionFailure”是否設(shè)置為true了。如果為true,就進(jìn)入下一次判斷,看老年區(qū)可用內(nèi)存是否大于之前每次Minor GC后進(jìn)入老年區(qū)對(duì)象的平均大小。如果老年代可用內(nèi)存小于平均大小或是參數(shù)沒(méi)有設(shè)置成true,那就會(huì)直接觸發(fā)“Full GC”,就是對(duì)老年代進(jìn)行垃圾回收,騰出空間后,再進(jìn)行Minor GC,相當(dāng)于對(duì)新生區(qū)、老年區(qū)統(tǒng)一做了一次清理。

    三種情況遞進(jìn)理解:

    1.如果Minor GC后,存活的對(duì)象<Survivor區(qū)大小,直接進(jìn)入Survivor區(qū)即可;

    2.如果Minor GC后,存活的對(duì)象>Survivor區(qū)大小,但<老年區(qū)可用內(nèi)存,直接進(jìn)入老年區(qū);

    3.若Minor GC后,此時(shí)老年區(qū)都放不下這些存活的對(duì)象了,就會(huì)觸發(fā)Full GC;
    如果Full GC后老年區(qū)內(nèi)存還是不夠用,就會(huì)導(dǎo)致OOM內(nèi)存溢出。

    四、老年區(qū)垃圾回收算法

    標(biāo)記整理算法

    【原理】

    一開(kāi)始對(duì)象都是任意分布的,在經(jīng)歷完垃圾回收之后,就會(huì)標(biāo)記出哪些是存活對(duì)象,哪些是垃圾對(duì)象,然后就會(huì)把這些存活的對(duì)象在內(nèi)存中進(jìn)行整理移動(dòng),盡量都挪到一邊去靠在一起,然后再把垃圾對(duì)象進(jìn)行清除,這樣做的好處就是避免了垃圾回收后產(chǎn)生的大片內(nèi)存碎片。

    JVM中垃圾回收機(jī)制的示例分析

    【缺點(diǎn)】

    較為耗時(shí),比復(fù)制算法慢10倍;

    所以如果系統(tǒng)頻繁出現(xiàn)Full GC,會(huì)嚴(yán)重影響系統(tǒng)性能,出現(xiàn)卡頓。所以JVM優(yōu)化的一大問(wèn)題就是減少Full GC頻率。

    五、垃圾回收器

    新生區(qū)和老年區(qū)進(jìn)行垃圾回收時(shí)是通過(guò)不同的垃圾回收器進(jìn)行回收的

    Seral 和 Seral Old垃圾回收器

    • 分別用于回收新生區(qū)和老年區(qū)。

    • 單線(xiàn)程運(yùn)行,垃圾回收時(shí)會(huì)停止我們系統(tǒng)的其他線(xiàn)程,再執(zhí)行垃圾回收(不再使用);

    ParNew和CMS垃圾回收器

    • 分別用于新生區(qū)和老年區(qū);

    • 多線(xiàn)程并發(fā),性能更好,現(xiàn)在一般是線(xiàn)上生產(chǎn)系統(tǒng)的標(biāo)配。

    G1垃圾回收器

    統(tǒng)一收集新生區(qū)和老年區(qū),采用更加優(yōu)秀的算法機(jī)制。

    感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“JVM中垃圾回收機(jī)制的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

    向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)容。

    jvm
    AI