Java垃圾回收機(jī)制詳解

1.什么是垃圾回收?
垃圾回收是JAVA自動(dòng)管理內(nèi)存的另一種叫法,目的是為了保證盡可能多的可用堆(heap),JVM會刪除堆上不再被引用的對象。

2.什么時(shí)候運(yùn)行垃圾回收?
內(nèi)存不夠時(shí),CUP空閑時(shí)

3.哪些情況的對象會被垃圾回收?
對象在內(nèi)存中分為三種狀態(tài):
a.可達(dá)狀態(tài)
一個(gè)對象創(chuàng)建后,有一個(gè)或多個(gè)引用變量引用該對象,那么它屬于可達(dá)狀態(tài)
b.可恢復(fù)狀態(tài)
在程序中沒有任何引用變量引用該對象,那么該對象進(jìn)入可恢復(fù)狀態(tài),此時(shí)從有向圖的起點(diǎn)開始,沒有找到該對象,此時(shí)垃圾回收機(jī)制開始轉(zhuǎn)變?yōu)榛厥赵搶ο笏加玫馁Y源,在回收該對象之前,系統(tǒng)會調(diào)用該對象的finalize()方法進(jìn)行資源清理,如果此時(shí)該對象自身被某個(gè)對象所引用(自救成功),那么它將恢復(fù)可達(dá)狀態(tài),否則進(jìn)入不可達(dá)狀態(tài)
c.不可達(dá)狀態(tài)
當(dāng)對象的所有關(guān)聯(lián)都被切斷,并且系統(tǒng)調(diào)用finalize()方法也并沒有讓它重新被引用,那么此時(shí)狀態(tài)為不可達(dá)狀態(tài),這時(shí)系統(tǒng)才會真正的回收該對象所占用的資源
(補(bǔ)充:
1.不要主動(dòng)調(diào)用finalize()方法,應(yīng)由系統(tǒng)自動(dòng)調(diào)用
2.finalize何時(shí)被調(diào)用不確定,不一定會被調(diào)用
3.調(diào)用finalize時(shí)可以將對象轉(zhuǎn)變?yōu)榭蛇_(dá)對象
4.當(dāng)調(diào)用fianlize時(shí)出現(xiàn)異常,將不會報(bào)出異常,繼續(xù)執(zhí)行
protected void finalize() throws Throwable
)

3.垃圾回收機(jī)制中的算法實(shí)現(xiàn)原理?
1.檢測垃圾對象
a.引用計(jì)數(shù)法:
引用計(jì)數(shù)法是垃圾回收機(jī)制的早期策略
實(shí)現(xiàn):給每個(gè)對象分配一個(gè)引用計(jì)數(shù)器,每當(dāng)該對象被引用一次,計(jì)數(shù)器就+1,每當(dāng)一個(gè)引用失效時(shí),計(jì)數(shù)器-1,當(dāng)一個(gè)對象的引用計(jì)數(shù)器為0時(shí),可以被當(dāng)做垃圾被系統(tǒng)回收。
優(yōu)點(diǎn):執(zhí)行速度快
缺點(diǎn):無法檢測出循環(huán)引用
b.引用可達(dá)法:
可達(dá):A對象引用了B對象,即A到B可達(dá)
通過一些列名為“GC ROOT”的對象作為起點(diǎn),從這些節(jié)點(diǎn)向下搜索,搜索過的路徑為“引用鏈”,當(dāng)一個(gè)對象到GC ROOT沒有任何引用鏈相連時(shí),該對象為不可用,是不可達(dá)的對象,此時(shí)垃圾回收器會開始回收它所占用的內(nèi)存
存活原則:一個(gè)能夠被根對象到達(dá)的對象

除堆以外,檢查方法區(qū)垃圾對象的方法:
1.(常量)判斷廢棄常量,如果常量池中的某個(gè)常量沒有被任何引用所引用的話,改常量為廢棄常量
2.(類)判斷無用的類:1.該類的所有實(shí)例對象都被回收,堆中無該類的任何實(shí)例對象
2.加載該類的類加載器已經(jīng)被回收
3.該類的java.lang.Class對象沒有任何地方所引用,無法通過反射機(jī)制訪問該類的方法

2.釋放空間:
釋放垃圾算法:
①標(biāo)記清除(Mark sweep) 分為標(biāo)記階段,清除階段,是最基礎(chǔ)的垃圾回收算法,容易實(shí)現(xiàn),但容易產(chǎn)生內(nèi)存碎片,導(dǎo)致找不到可以為大對象分配的內(nèi)存空間,需要引發(fā)新一輪的垃圾回收


image.png

②復(fù)制(Coping)將內(nèi)存容量分為大小相同的兩塊,每次只使用一塊,當(dāng)這塊使用滿了,就將還存活的對象復(fù)制到另一塊上,然后把此塊的內(nèi)存統(tǒng)一清理掉,不會產(chǎn)生內(nèi)存碎片,高效,但是能夠使用的內(nèi)存縮減到原來的一半,并且如果存活的對象過多,會降低效率


image.png

③標(biāo)記整理(Mark Compact)同標(biāo)記清除一樣,標(biāo)記對象后,但不清理,將存活的對象移動(dòng)到一端,然后再清除邊界以外的內(nèi)存
image.png

④分代(Generation Collection)借助前面三種算法實(shí)現(xiàn),是目前JVM采用較多的算法
老年代Tenured Generation:每次回收較少的對象,一般使用標(biāo)記整理

新生代Young Generation:每次回收較多的對象,采用Coping復(fù)制,因?yàn)槊看味家厥沾罅康膶ο螅敲床僮鞔螖?shù)不會很頻繁,同時(shí),實(shí)際中采取的不是1:1,而是劃分為一塊大的Eden區(qū),兩塊小的Survivor區(qū),每次使用Eden區(qū)和一塊小的Survivor區(qū),當(dāng)回收時(shí),將Eden區(qū)和Survivor區(qū)存活的對象,復(fù)制到另一塊Survivor區(qū),并清除剛才使用的Eden區(qū)和Survivor區(qū)。

4.對象的四種引用方式?
強(qiáng)引用,弱引用,軟引用,虛引用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容