前言
之前有提到過(guò)秘症,GC的垃圾回收機(jī)制以及觸發(fā)情況捌肴,雖然這個(gè)都是虛擬機(jī)默默執(zhí)行的,不需要我們手動(dòng)去GC捺檬,但是了解GC的原理再层,有助于我們碼出未來(lái);
GC垃圾回收算法
GC常用算法有:
引用計(jì)數(shù)法堡纬,標(biāo)記-清除算法聂受,復(fù)制算法,標(biāo)記-整理算法烤镐,分代收集算法蛋济;
HotSpot虛擬機(jī)采用的是分代收集算法;
標(biāo)記-清除 算法
標(biāo)記-清除算法對(duì)根集合進(jìn)行掃描炮叶,對(duì)存活的對(duì)象進(jìn)行標(biāo)記碗旅。標(biāo)記完成后渡处,再對(duì)整個(gè)空間內(nèi)未被標(biāo)記的對(duì)象掃描,進(jìn)行回收祟辟;
優(yōu)勢(shì):實(shí)現(xiàn)簡(jiǎn)單医瘫,不需要進(jìn)行對(duì)象進(jìn)行移動(dòng)
缺點(diǎn):標(biāo)記、清除過(guò)程效率低旧困,產(chǎn)生大量不連續(xù)的內(nèi)存碎片醇份,提高了垃圾回收的頻率
復(fù)制算法
這種收集算法解決了標(biāo)記清除算法存在的效率問(wèn)題。
它將內(nèi)存區(qū)域?qū)Π敕珠_(kāi)吼具。每次僅使用一半的空間僚纷,JVM生成的新對(duì)象放在一半空間中。當(dāng)一半空間用完時(shí)進(jìn)行GC馍悟,把可到達(dá)對(duì)象復(fù)制到另一半空間畔濒,然后把使用過(guò)的內(nèi)存空間一次清理掉;
優(yōu)勢(shì):按順序分配內(nèi)存即可锣咒,實(shí)現(xiàn)簡(jiǎn)單侵状、運(yùn)行高效,不用考慮內(nèi)存碎片
缺點(diǎn):可用的內(nèi)存大小縮小為原來(lái)的一半毅整,對(duì)象存活率高時(shí)會(huì)頻繁進(jìn)行復(fù)制趣兄,而且空間利用率不高
標(biāo)記-整理算法
標(biāo)記-整理算法 采用和 標(biāo)記-清除算法 一樣的方式進(jìn)行對(duì)象的標(biāo)記,但后續(xù)不直接對(duì)可回收對(duì)象進(jìn)行清理悼嫉,而是將所有的存活對(duì)象往一端空閑空間移動(dòng)艇潭,然后清理掉端邊界以外的內(nèi)存空間
優(yōu)勢(shì):解決了標(biāo)記-清理算法存在的內(nèi)存碎片問(wèn)題
缺點(diǎn):需要進(jìn)行局部對(duì)象移動(dòng),一定程度上降低了效率
分代收集算法
分代收集算法戏蔑,顧名思義是根據(jù)對(duì)象的存活周期將內(nèi)存劃分為幾塊蹋凝,將堆分為新生代(Young)和老年代(Tenure),新生代又分為一個(gè)eden區(qū)和兩個(gè)survivor區(qū);
大部分被新創(chuàng)建的對(duì)象會(huì)被分配到這里总棵,由于大部分對(duì)象在創(chuàng)建后會(huì)很快變得不可達(dá)鳍寂,所以很多對(duì)象被創(chuàng)建在新生代,然后消失情龄。對(duì)象從這個(gè)區(qū)域消失的過(guò)程我們稱(chēng)之為 minor GC迄汛;
在新生代中,由于對(duì)象生存期短骤视,每次回收都會(huì)有大量對(duì)象死去鞍爱,那么這時(shí)就采用復(fù)制算法。老年代里的對(duì)象存活率較高专酗,沒(méi)有額外的空間進(jìn)行分配擔(dān)保睹逃,所以可以使用標(biāo)記-整理 或者 標(biāo)記-清除;