jvm 基礎篇-(5)- 垃圾回收算法--->復制算法(-XX:SurvivorRatio)Monitor GC 、 Young GC、跨代引用對YoungGen區(qū)影響(RememberSet、...

告訴自己技術不枯燥

1、復制算法

復制(Copying)算法說到底也是為了解決 標記-清除算法 產(chǎn)生的那些碎片問題。

首先將內(nèi)存分為大小相等的兩部分(假設A、B兩部分),每次呢只使用其中的一部分(這里我們假設為A區(qū)),等這部分用完了,這時候就將這里面還能活下來的對象復制到另一部分內(nèi)存(這里設為B區(qū))中,然后把A區(qū)中的剩下部分全部清理掉。

  • 優(yōu)勢:這樣一來每次清理都要對一半的內(nèi)存進行回收操作,這樣內(nèi)存碎片的問題就解決了,可以說簡單,高效。
  • 缺點:但是呢,肯定發(fā)現(xiàn)了,本來挺大一片地方,現(xiàn)在只能用一半,搞得挺不爽的,世界上本來沒有免費的飯菜,就算是用空間換取時間吧。

實際應用:CMS新生代的Young GC、G1和ZGC都基于標記-復制算法,但算法具體實現(xiàn)的不同就導致了巨大的性能差異。

復制算法過程圖

2、年輕代GC過程

看完復制算法后,讓我們看看虛擬機是如何用復制算法治理新生代的~

年輕代劃分

Young Generation :劃分為Eden區(qū)和Survivor區(qū),其中Survivor區(qū)又分為From區(qū)與To區(qū),其中默認Eden : Survivor為8:1。-XX:SurvivorRatio=8

圖解YoungGeneration一次MonitorGC全過程
一個對象的這一輩子

???????我是一個普通的Java對象,我出生在Eden區(qū),在Eden區(qū)我還看到和我長的很像的小兄弟,我們在Eden區(qū)中玩了挺長時間。有一天Eden區(qū)中的人實在是太多了,我就被迫去了Survivor區(qū)的“From”區(qū),自從去了Survivor區(qū),我就開始漂了,有時候在Survivor的“From”區(qū),有時候在Survivor的“To”區(qū),居無定所。直到我15(-XX:MaxTenuringThreshold)歲的時候,爸爸說我成人了,該去社會上闖闖了。于是我就去了年老代那邊,年老代里,人很多,并且年齡都挺大的,我在這里也認識了很多人。在年老代里,我生活了20年(每次GC加一歲),然后被回收。

3、MintorGC:

jvm 優(yōu)化篇-(8)-跨代引用問題(RememberSet、CardTable、ModUnionTable、DirtyCard)<<<<<傳送門

4、復制算法痛點分析:

標記-復制算法應用在CMS新生代(ParNew是CMS默認的新生代垃圾回收器)和G1垃圾回收器中。標記-復制算法可以分為三個階段:
  • 標記階段,即從GC Roots集合開始,標記活躍對象;
  • 轉移階段,即把活躍對象復制到新的內(nèi)存地址上;
  • 重定位階段,因為轉移導致對象的地址發(fā)生了變化,在重定位階段,所有指向?qū)ο笈f地址的指針都要調(diào)整到對象新的地址上。

面試常問問題:

  • 為何新生代采用復制算法:

????這和新生代中的對象生命周期息息相關,新生代對象共同特點朝生夕死,IBM的專門研究表明,新生代中的對象98%是朝生夕死的。

  • SurvivorRatio為何設置為8:

????默認Eden和Survivor的大小比例是8∶1,也就是每次新生代中可用內(nèi)存空間為整個新生代容量的90%(80%+10%),只有10%的內(nèi)存是會被"浪費"的。
????當然,98%的對象可回收只是一般場景下的數(shù)據(jù),我們沒有辦法保證每次回收都只有不多于10%的對象存活,如果To空間沒有足夠的空間存放上一次新生代存活的對象,這些對象將直接通過分配擔保機制進入老年代。
????兩個極端分析:
???????? 1、設置比例過大,Eden區(qū)相對會大,MonitorGC頻次就會變少,一次MonitorGC的時間會拉長。From空間與To空間相對較小,這回加快對象老化,從而加快進入老年代時間(缺點)
???????? 2、設置比例過小:
???????? ????a、From空間與To空間相對會很大,浪費的空間相對會變大。(缺點)
???????? ????b、Eden區(qū)相對會變小,MonitorGC執(zhí)行頻次會增加,MonitorGC執(zhí)行時間會縮短。Eden區(qū)創(chuàng)建對象空間不足,直接通過分配擔保機制進入老年代(對象年齡為1的直接進入老年代)。(缺點)
???????? ????c、To空間變大,意味著可以存儲更多在Monitor GC后任存活的對象,避免其進入老年代。(優(yōu)點)


???????? 總結:-XX:SurvivorRatio=8 這個閥值不是絕對的,針對IO密集型的、CPU密集型的,開發(fā)人員應該動態(tài)調(diào)配,沒有萬能的配置參數(shù)來支撐所有應用場景。

Young Generation有關的jvm參數(shù)

-XX:NewSize和-XX:MaxNewSize
-XX:SurvivorRatio=8
-XX:NewRatio=3

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容