[转]java垃圾回收之循环引用
工作原理:為每個(gè)內(nèi)存對(duì)象維護(hù)一個(gè)引用計(jì)數(shù)。
當(dāng)有新的引用指向某對(duì)象時(shí)就將該對(duì)象的引用計(jì)數(shù)加一,當(dāng)指向該對(duì)象的引用被銷(xiāo)毀時(shí)將該計(jì)數(shù)減一,當(dāng)計(jì)數(shù)歸零時(shí),就回收該對(duì)象所占用的內(nèi)存資源。
缺陷:在每次內(nèi)存對(duì)象被引用或引用被銷(xiāo)毀的時(shí)候都必須修改引用計(jì)數(shù),這類(lèi)操作被稱(chēng)為footprint。引用計(jì)數(shù)的footprint是很高的。這使得程序整體的性能受到比較大的影響。因此多數(shù)現(xiàn)代的程序語(yǔ)言都不適用引用計(jì)數(shù)作為垃圾收集的實(shí)現(xiàn)算法。
另外,引用計(jì)數(shù)還有一個(gè)致命的缺陷,當(dāng)程中出現(xiàn)序循環(huán)引用時(shí),引用計(jì)數(shù)算法無(wú)法檢測(cè)出來(lái),被循環(huán)引用的內(nèi)存對(duì)象就成了無(wú)法回收的內(nèi)存。從而引起內(nèi)存泄露。
?
舉例說(shuō)明就是:
?
class A{public B b;} class B{public A a; } public class Main{public static void main(String[] args){A a = new A();B b = new B();a.b=b;b.a=a;} }?
在函數(shù)的結(jié)尾,a和b的計(jì)數(shù)均為2
?
先撤銷(xiāo)a,然后a的計(jì)數(shù)為1,在等待b.a對(duì)a的引用的撤銷(xiāo),也就是在等待b的撤銷(xiāo)
對(duì)于b來(lái)講,也是同理
兩個(gè)對(duì)象都在等待對(duì)方撤銷(xiāo),所有這兩個(gè)資源均不能釋放
?
?
- 標(biāo)記-清除(Mark-Sweep)
此算法執(zhí)行分兩階段。第一階段從引用根節(jié)點(diǎn)開(kāi)始標(biāo)記所有被引用的對(duì)象,第二階段遍歷整個(gè)堆,把未標(biāo)記的對(duì)象清除。此算法需要暫停整個(gè)應(yīng)用,同時(shí),會(huì)產(chǎn)生內(nèi)存碎片。 - 復(fù)制(Copying)
此算法把內(nèi)存空間劃為兩個(gè)相等的區(qū)域,每次只使用其中一個(gè)區(qū)域。垃圾回收時(shí),遍歷當(dāng)前使用區(qū)域,把正在使用中的對(duì)象復(fù)制到另外一個(gè)區(qū)域中。次算法每次只處理正在使用中的對(duì)象,因此復(fù)制成本比較小,同時(shí)復(fù)制過(guò)去以后還能進(jìn)行相應(yīng)的內(nèi)存整理,不過(guò)出現(xiàn)"碎片"問(wèn)題。當(dāng)然,此算法的缺點(diǎn)也是很明顯的,就是需要兩倍內(nèi)存空間。 - 標(biāo)記-整理(Mark-Compact)
此算法結(jié)合了"標(biāo)記-清除"和"復(fù)制"兩個(gè)算法的優(yōu)點(diǎn)。也是分兩階段,第一階段從根節(jié)點(diǎn)開(kāi)始標(biāo)記所有被引用對(duì)象,第二階段遍歷整個(gè)堆,把清除未標(biāo)記對(duì)象并且把存活對(duì)象"壓縮"到堆的其中一塊,按順序排放。此算法避免了"標(biāo)記-清除"的碎片問(wèn)題,同時(shí)也避免了"復(fù)制"算法的空間問(wèn)題。 - 增量收集(Incremental Collecting)
實(shí)施垃圾回收算法,即:在應(yīng)用進(jìn)行的同時(shí)進(jìn)行垃圾回收。不知道什么原因JDK5.0中的收集器沒(méi)有使用這種算法的。 - 分代(Generational Collecting)
基于對(duì)對(duì)象生命周期分析后得出的垃圾回收算法。把對(duì)象分為年青代、年老代、持久代,對(duì)不同生命周期的對(duì)象使用不同的算法(上述方式中的一個(gè))進(jìn)行回收。現(xiàn)在的垃圾回收器(從J2SE1.2開(kāi)始)都是使用此算法的。
- 標(biāo)記-清除(Mark-Sweep)
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/lihaozy/archive/2013/06/08/3125974.html
總結(jié)
以上是生活随笔為你收集整理的[转]java垃圾回收之循环引用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [翻译]NUnit---Descript
- 下一篇: GridView的 使用