強(qiáng)引用
如果一個(gè)對(duì)象具有強(qiáng)引用,那么絕不會(huì)被垃圾回收器回收密浑,即使拋出OO異常
軟引用
如果一個(gè)對(duì)象具有軟引用,那么就在垃圾回收器之后內(nèi)存依然不足的情況下被垃圾回收器回收。對(duì)應(yīng)于生活中的食之無(wú)味棄之可惜之物品的設(shè)定奢入,如果空間足夠則不做丟棄,如果空間清掃后依然不足則被丟棄媳叨。
弱引用
如果一個(gè)對(duì)象具有弱引用腥光,那么就在垃圾回收器的線(xiàn)程掃描時(shí)必定被干掉,不過(guò)由于垃圾回收器線(xiàn)程優(yōu)先級(jí)比較低糊秆,所以弱引用的對(duì)象也不會(huì)那么容易被發(fā)現(xiàn)
GC ROOT
虛擬機(jī)(JVM)棧中引用對(duì)象
方法區(qū)中的類(lèi)靜態(tài)屬性引用對(duì)象
方法區(qū)中常量引用的對(duì)象(final 的常量值)
本地方法棧JNI的引用對(duì)象
由來(lái)
我們會(huì)在開(kāi)發(fā)中遇到一種情形武福,如果需要用一個(gè)全局靜態(tài)變量Map來(lái)保存線(xiàn)程和與之對(duì)應(yīng)的值 比如 Map map = HashMap<>,但隨之帶來(lái)的一個(gè)問(wèn)題就是我們?nèi)绾卧诰€(xiàn)程結(jié)束之后把與之對(duì)應(yīng)的值刪除呢痘番?ThreadLocal就是為了解決這種問(wèn)題存在的捉片,且對(duì)用戶(hù)透明
ThreadLocal源碼的大致思路如下:每個(gè)Thread里面保存有一個(gè)TheadLocalMap對(duì)象平痰,里面對(duì)應(yīng)的Entry 的key為T(mén)hreadLocal的弱引用,所以我們能在當(dāng)前線(xiàn)程得到ThreadLocal對(duì)應(yīng)的值……引出一個(gè)問(wèn)題界睁,為什么要用弱引用來(lái)作為key??
(實(shí)線(xiàn)為強(qiáng)引用觉增,虛線(xiàn)為弱引用)?
當(dāng)圖中ThreadLocal實(shí)例被設(shè)置為null之后沒(méi)有任何強(qiáng)引用指向ThreadLocal,那key對(duì)應(yīng)的弱引用被回收( 一開(kāi)始的認(rèn)知總會(huì)感覺(jué)翻斟,用一個(gè)weakreference去引用一個(gè)對(duì)象一點(diǎn)都不靠譜逾礁,畢竟該引用指向的對(duì)象,在GC的時(shí)候就會(huì)被回收访惜,完全沒(méi)有任何保證嘹履。針對(duì)上面這個(gè)想法,因?yàn)橐粋€(gè)對(duì)象可能會(huì)存在多個(gè)引用參與债热,所以應(yīng)該更多是強(qiáng)弱同時(shí)去引用某個(gè)對(duì)象砾嫉,只有當(dāng)所有強(qiáng)引用都失效之后,你的這個(gè)弱引用才有風(fēng)險(xiǎn)被回收掉窒篱。)焕刮,但是value卻存在一條由Current Thread ref引出的強(qiáng)引用,此時(shí)value是不可能被GC掉的墙杯,直到線(xiàn)程結(jié)束,引用鏈被斷開(kāi)配并,對(duì)象才有可能被回收。