Java虛擬接垃圾回收器是垃圾回收算法的具體實(shí)現(xiàn)非区,一種回收器可能是不同回收算法的結(jié)合朽色,首先來(lái)了解下不同的垃圾回收算法谤牡。
回收算法
標(biāo)記-清除算法
顧名思義实柠,該算法分為標(biāo)記和清除兩個(gè)過(guò)程:
? 標(biāo)記:給所有需要回收的對(duì)象(對(duì)象已不可達(dá)
)打上標(biāo)記。
? 清除:統(tǒng)一回收打上標(biāo)記的對(duì)象拯杠。
標(biāo)記-清除算法的不足
:
? 標(biāo)記和清除兩個(gè)過(guò)程的效率都不高
? 如圖掏婶,回收后內(nèi)存產(chǎn)生了大量的碎片
,在以后分配大對(duì)象時(shí)潭陪,可能會(huì)提前觸發(fā)回收
復(fù)制算法
該算法將內(nèi)存空間劃分為大小相等的兩塊
雄妥,但只使用其中一塊用來(lái)分配對(duì)象
。
當(dāng)這一塊內(nèi)存用完后依溯,將存活的對(duì)象復(fù)制
到另一塊上老厌,再將使用的內(nèi)存塊一次清理。
? 復(fù)制算法提高了效率
黎炉,同時(shí)也避免了內(nèi)存碎片
的產(chǎn)生枝秤;
? 每次只能使用一半內(nèi)存,內(nèi)存利用率不高
現(xiàn)在的虛擬機(jī)新生代的回收器都采用復(fù)制算法來(lái)實(shí)現(xiàn)
慷嗜。同時(shí)針對(duì)內(nèi)存空間利用率不高的問題淀弹。
不再將內(nèi)存空間劃分為1:1,而是劃分為Eden空間
和Survivor空間
庆械,Eden:Survivor:Survivor = 8:1:1
薇溃;
每次使用Eden空間和一個(gè)Survivor空間來(lái)分配內(nèi)存,將回收后存活的對(duì)象復(fù)制到另一個(gè)Survivor空間干奢。 這樣內(nèi)存的利用率就達(dá)到了90%痊焊。如圖(圖中比例忽略)
注:當(dāng)存活的對(duì)象大于Survivor的空間時(shí)盏袄,需要將對(duì)象直接分配到老年代
忿峻。
標(biāo)記-整理算法
標(biāo)記-清除算法導(dǎo)致內(nèi)存碎片的產(chǎn)生
復(fù)制算法犧牲掉內(nèi)存的利用率的同時(shí)還要考慮極端情況下(存活對(duì)象大于Survivor空間
)向老年代申請(qǐng)內(nèi)存
標(biāo)記-整理算法就此應(yīng)運(yùn)而生。
? 標(biāo)記階段還是給需要的對(duì)象打上標(biāo)記
辕羽。
? 整理階段將存活的對(duì)象全部移動(dòng)到內(nèi)存的一端逛尚,對(duì)端邊界以外的內(nèi)存進(jìn)行清理
。
分代收集
在復(fù)制算法中刁愿,有提到新生代和老年代绰寞。這是一種根據(jù)對(duì)象存活周期的不同進(jìn)行劃分
的思想。
新生代:對(duì)象”朝生夕死“,存活少
滤钱,采用復(fù)制算法
回收觉壶。
老年代:對(duì)象存活率高
,且不能額外申請(qǐng)內(nèi)存
件缸,采用“標(biāo)記-清除”
或者"標(biāo)記-整理”
算法回收铜靶。
了解了垃圾回收算法,下次分享學(xué)習(xí)中學(xué)習(xí)不同的垃圾回收器他炊。