1.引言
最近在看jvm的書(shū)籍澈蚌。感覺(jué)講的不錯(cuò)亦镶,自己把一些有意思的地方日月,記錄下袱瓮,增加印象。
2.正題
2.1 GC垃圾回收器爱咬,回收的垃圾是什么?
定義: 沒(méi)有直接或者間接與GCRoots相通的對(duì)象尺借,都是GC回收的對(duì)象,也就是"垃圾"精拟。
2.2什么是GCRoots
GCRoot 個(gè)人理解為是一個(gè)除Object之外的對(duì)象燎斩。能作為GCRoots的對(duì)象大部分存在于以下幾種地方.
1.虛擬機(jī)棧中引用的對(duì)象: 虛擬機(jī)棧里面保存的是棧幀,棧幀里面有變量表。變量表中有些引用變量蜂绎。
2.方法區(qū)保存著類(lèi)信息,常量栅表,靜態(tài)變量,靜態(tài)的引用變量,也會(huì)是GCRoot
3.方法區(qū)中常量對(duì)象,用final修飾的對(duì)象师枣。
2.3四種引用類(lèi)型
jdk版本1.2之前怪瓶,一個(gè)對(duì)象只有引用和被引用倆種狀態(tài)。后來(lái)人們發(fā)現(xiàn)這種定義的方式太狹隘了践美。于是出現(xiàn)了強(qiáng)引用,軟引用,弱引用,虛引用洗贰。
強(qiáng)引用:指的是Student a=new Student(); 這樣方式的生成的對(duì)象。在任何時(shí)候哪怕報(bào)錯(cuò)陨倡,也不會(huì)主動(dòng)去回收這部分的內(nèi)存哆姻。
軟引用:SoftReference<Object> sf = new SoftReference<Object>(obj); 這樣來(lái)聲明對(duì)象的方式稱(chēng)之為軟引用。當(dāng)內(nèi)存不夠的時(shí)候玫膀,會(huì)主動(dòng)回收軟引用對(duì)象矛缨。
弱引用:WeakReference<Object> wf = new WeakReference<Object>(obj); 這樣來(lái)聲明對(duì)象的方式的成為弱引用。不管內(nèi)存夠都進(jìn)行回收帖旨。
3.內(nèi)存回收算法
3.1標(biāo)記-清除算法
將無(wú)用的內(nèi)存標(biāo)記箕昭,然后統(tǒng)一清除。
缺點(diǎn):工作效率低下解阅,會(huì)產(chǎn)生大量的碎片落竹。當(dāng)無(wú)法找到足夠的內(nèi)存的時(shí)候,不得不在執(zhí)行一次回收货抄。
3.2復(fù)制-清除算法
將10M的內(nèi)存述召,分成倆個(gè)5M的內(nèi)存塊。首先會(huì)使用其中一個(gè)5M的內(nèi)存塊蟹地。當(dāng)這個(gè)內(nèi)存塊滿(mǎn)了积暖。將存活的對(duì)象,復(fù)制到另外一個(gè)5M的內(nèi)存塊上怪与,一次性清楚已經(jīng)滿(mǎn)了的內(nèi)存塊夺刑。這樣就不會(huì)產(chǎn)生內(nèi)存碎片了。
缺點(diǎn):當(dāng)存活的對(duì)象較多的時(shí)候,那么復(fù)制算法的執(zhí)行效率比較低遍愿。不適合老年代存淫。適合青年代。
3.3標(biāo)記-整理算法
將可回收的對(duì)象沼填,標(biāo)記桅咆,清除,然后整理內(nèi)存坞笙,讓存活的對(duì)象集中起來(lái)岩饼。這樣就不會(huì)產(chǎn)生碎片。
3.4分代收集算法
目前商業(yè)中經(jīng)常使用的內(nèi)存回收策略羞海。對(duì)青年代使用標(biāo)記-復(fù)制算法。對(duì)老年代使用標(biāo)記-清除或者標(biāo)記-整理算法曲管。