扣丁學(xué)堂淺談關(guān)于Java如何判定內(nèi)存中的垃圾
2018-01-02 11:27:55
1226瀏覽
今天扣丁學(xué)堂給大家介紹一下關(guān)于Java如何判定內(nèi)存中的垃圾介紹,下面我們一起來看一下吧。
1、引用計數(shù)器算法
解釋:系統(tǒng)給每個對象添加一個引用計數(shù)器,每當(dāng)有一個地方引用這個對象的時候,計數(shù)器就加1,當(dāng)引用失效的時候,計數(shù)器就減1,在任何一個時刻計數(shù)器為0的對象就是不可能被使用的對象,因為沒有任何地方持有這個引用,這時這個對象就被視為內(nèi)存垃圾,等待被虛擬機回收。
優(yōu)點:客觀的說,引用計數(shù)器算法,他的實現(xiàn)很簡單,判定的效率很高,在大部分情況下這都是相當(dāng)不錯的算法,其實,很多案例中都使用了這種算法,比如IOS的Object-C,微軟的COM技術(shù)(用于給window開發(fā)驅(qū)動,.net里面的技術(shù)幾乎都是建立在COM上的),Python語言等。
缺陷:無法解決循環(huán)引用的問題。這就好像是懸崖邊的人采集草藥的人,想要活下去就必須要有一根繩子綁在懸崖上.如果有兩個人,甲的手拉著懸崖,乙的手拉著甲,那么這兩個人都能活,但是,如果甲的手拉著乙,乙的手也拉著甲,雖然這兩個人都認為自己被別人拉著,但是一樣會掉下懸崖.
比如說A對象的一個屬性引用B,B對象的一個屬性同時引用AA.b=B()B.a=A();這個A,B對象的計數(shù)器都是1,可是,如果沒有其他任何地方引用A,B對象的時候,A,B對象其實在系統(tǒng)中是無法發(fā)揮任何作用的,既然無法發(fā)揮作用,那就應(yīng)該被視作內(nèi)存垃圾予以清理掉,可是因為此時A,B的計數(shù)器的值都是1,虛擬機就無法回收A,B對象,這樣就會造成內(nèi)存浪費,這在計算機系統(tǒng)中是不可容忍的.
解決辦法:在語言層面處理,例如Object-C就使用強弱引用類型來解決問題.強引用計數(shù)器加1,弱引用不增加Java中也有強弱引用
2、可達性分析算法
解釋:這種算法通過一系列成為"GCRoots"的對象作為起始點,從這些節(jié)點開始向下搜索所有走過的路徑成為引用鏈(ReferenceChain),當(dāng)一個對象GCRoots沒有任何引用鏈相連(用圖論的話來說就是從GCRoots到這個對象不可達),則證明此對象是不可用的
優(yōu)點
這個算法可以輕松的解決循環(huán)引用的問題
大部分的主流java虛擬機使用的都是這種算法
Java語言中的GCRoots
在虛擬機棧(其實是棧幀中的本地變量表)中引用的對象
在方法區(qū)中的類靜態(tài)屬性引用對象
在方法區(qū)中的常量引用的對象
在本地方法棧中JNI(即一般說的Native方法)的引用對象
好了,關(guān)于Java如何判定內(nèi)存中的垃圾就為大家簡單介紹到這里,想要學(xué)習(xí)Java開發(fā)的小伙伴可以選擇口碑良好的扣丁學(xué)堂學(xué)習(xí),扣丁學(xué)堂不僅有專業(yè)的老師和與時俱進的
Java培訓(xùn)課程體系,還有大量的
Java視頻教程供學(xué)員觀看學(xué)習(xí),喜歡的小伙伴抓緊時間行動吧。Java技術(shù)交流群:670348138。
【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】
查看更多關(guān)于“Java開發(fā)資訊”的相關(guān)文章>>
標(biāo)簽:
JavaEE視頻教程
JavaEE培訓(xùn)
JavaEE開發(fā)工程師
Java培訓(xùn)