強(qiáng)引用
Strong reference就是我們常見的引用指向一個(gè)對(duì)象,只要強(qiáng)引用指向一個(gè)對(duì)象谓罗,就能表明對(duì)象還活著粱哼,垃圾收集器就不會(huì)碰這種對(duì)象
軟引用
Soft reference一種相對(duì)強(qiáng)引用弱化的一種引用,當(dāng)JVM認(rèn)為內(nèi)存不足時(shí)檩咱,才會(huì)試圖去回收軟引用揭措。JVM會(huì)確保在OOM之前,清理軟引用指向的對(duì)象刻蚯,
可以和一個(gè)引用隊(duì)列聯(lián)合使用绊含,如果軟引用所引用的對(duì)象被垃圾回收器回收,Java虛擬機(jī)會(huì)把這個(gè)軟引用所引用的對(duì)象加入到與之關(guān)聯(lián)的引用隊(duì)列中炊汹,后續(xù)躬充,我們可以調(diào)用RefrenceQueue的poll()方法檢測是否他關(guān)心的對(duì)象被回收了,如果隊(duì)列為空讨便,將返回一個(gè)null充甚,否則該方法返回隊(duì)列中前面的一個(gè)Reference對(duì)象
應(yīng)用:圖片使用緩存
弱引用
Week reference提供一種訪問在弱引用狀態(tài)下對(duì)象的途徑,引用生命周期比弱引用短霸褒,在垃圾回收線程掃描他所管轄的內(nèi)存區(qū)域過程中伴找,一旦發(fā)現(xiàn)了具有弱引用對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否都會(huì)回收他废菱。弱引用也可以和引用隊(duì)列聯(lián)合使用
應(yīng)用:靜態(tài)內(nèi)部類中疆瑰,經(jīng)常會(huì)使用虛引用,列如:一個(gè)類發(fā)送網(wǎng)絡(luò)請(qǐng)求昙啄,承當(dāng)callback的靜態(tài)內(nèi)部類,則常以虛引用的方式來保存外部類的引用寸五,當(dāng)外部類需要被jvm回收時(shí)梳凛,不會(huì)因?yàn)榫W(wǎng)絡(luò)請(qǐng)求沒有及時(shí)回來,導(dǎo)致外部類不能被回收梳杏、引起內(nèi)存泄露
幻象引用(虛引用)
不能通過他訪問對(duì)象韧拒,僅僅是提供了一種確保對(duì)象被finallize以后淹接,做某些事情的機(jī)制。如果一個(gè)對(duì)象持有虛引用叛溢,那么他和沒有任何引用一樣塑悼,在任何時(shí)候都可能被垃圾回收器回收,必須和引用隊(duì)列聯(lián)合使用楷掉。當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí)厢蒜,如果發(fā)現(xiàn)它還有虛引用,就會(huì)在回收對(duì)象的內(nèi)存之前烹植,把這個(gè)虛引用加入到與之關(guān)聯(lián)的引用隊(duì)列中
程序可以通過判斷引用隊(duì)列中是否已經(jīng)加入了虛引用斑鸦,來了解被引用的對(duì)象是否將要被垃圾回收。如果程序發(fā)現(xiàn)某個(gè)虛引用草雕,已經(jīng)被加入到引用隊(duì)列巷屿,那么久可以在所有引用的對(duì)象的內(nèi)存被回收之前采取一些行動(dòng)
當(dāng)一個(gè)虛引用關(guān)聯(lián)的對(duì)象被垃圾收集器回收之前會(huì)收到一條系統(tǒng)通知
對(duì)象的可達(dá)性
GC就是依據(jù)這種可達(dá)性來回收對(duì)象的,如果錯(cuò)誤的保持強(qiáng)引用(比如墩虹,賦值給了static變量)嘱巾,那么對(duì)象可能就沒有機(jī)會(huì)變成類似弱引用的狀態(tài)了,就會(huì)產(chǎn)生內(nèi)存泄露