
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

一個對象的這一輩子
???????我是一個普通的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