引用
java強(qiáng)引用绒窑,軟引用棕孙,弱引用,虛引用
強(qiáng)引用
Java中的引用些膨,有點(diǎn)像C++的指針蟀俊。通過引用,可以對(duì)堆中的對(duì)象進(jìn)行操作订雾。
在某函數(shù)中肢预,當(dāng)創(chuàng)建了一個(gè)對(duì)象,該對(duì)象被分配在堆中洼哎,通過這個(gè)對(duì)象的引用才能對(duì)這個(gè)對(duì)象進(jìn)行操作烫映。
軟引用
軟引用的強(qiáng)度是僅次于強(qiáng)引用的,如果一個(gè)對(duì)象只具有軟引用噩峦,則內(nèi)存空間足夠锭沟,垃圾回收器就不會(huì)回收它;如果內(nèi)存空間不足了识补,就會(huì)回收這些對(duì)象的內(nèi)存族淮。
只要垃圾回收器沒有回收它,該對(duì)象就可以被程序使用。軟引用可用來實(shí)現(xiàn)內(nèi)存敏感的高速緩存瞧筛。
弱引用
弱引用的強(qiáng)度比軟引用更次,也就是說只具有弱引用的對(duì)象擁有更短暫的生命周期导盅。
在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過程中较幌,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否白翻,都會(huì)回收它的內(nèi)存乍炉。
不過,由于垃圾回收器是一個(gè)優(yōu)先級(jí)很低的線程滤馍,因此不一定會(huì)很快發(fā)現(xiàn)那些只具有弱引用的對(duì)象岛琼。
如果這個(gè)對(duì)象是偶爾的使用,并且希望在使用時(shí)隨時(shí)就能獲取到巢株,但又不想影響此對(duì)象的垃圾收集槐瑞,那么你應(yīng)該用 Weak Reference 來標(biāo)記此對(duì)象。
弱引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用阁苞,如果弱引用所引用的對(duì)象被垃圾回收困檩,Java虛擬機(jī)就會(huì)把這個(gè)弱引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。
當(dāng)你想引用一個(gè)對(duì)象那槽,但是這個(gè)對(duì)象有自己的生命周期悼沿,你不想介入這個(gè)對(duì)象的生命周期,這時(shí)候你就是用弱引用骚灸。
這個(gè)引用不會(huì)在對(duì)象的垃圾回收判斷中產(chǎn)生任何附加的影響
虛引用
虛引用顧名思義就是形同虛設(shè)糟趾,虛引用也稱為幻影引用:一個(gè)對(duì)象是都有虛引用的存在都不會(huì)對(duì)生存時(shí)間都構(gòu)成影響,也無法通過虛引用來獲取對(duì)一個(gè)對(duì)象的真實(shí)引用甚牲。
唯一的用處:能在對(duì)象被GC時(shí)收到系統(tǒng)通知义郑,JAVA中用PhantomReference來實(shí)現(xiàn)虛引用。
搞笑的例子
強(qiáng)引用:就像是老板(OOM)的親兒子一樣鳖藕,在公司可以什么事都不干魔慷,但是千萬不要老是占用公司的資源為他自己做事,記得用完公司的妹子之后,要讓她們?nèi)スぷ?資源要懂得釋放) 不然公司很可能會(huì)垮掉的著恩。
軟引用:有點(diǎn)像老板(OOM)的親戚院尔,在公司表現(xiàn)不好有可能會(huì)被開除,即使你投訴他(調(diào)用GC)上班看片喉誊,但是只要不被老板看到(被JVM檢測(cè)到)就不會(huì)被開除(被虛擬機(jī)回收)邀摆。
弱引用:就是一個(gè)普通的員工,平常如果表現(xiàn)不佳會(huì)被開除(對(duì)象沒有其他引用的情況下)伍茄,遇到別人投訴(調(diào)用GC)上班看片,那開除是肯定了(被虛擬機(jī)回收)栋盹。
虛引用:這貨估計(jì)就是個(gè)實(shí)習(xí)生跟臨時(shí)工把,遇到事情的時(shí)候想到了你敷矫,沒有事情的時(shí)候例获,秒秒鐘拿出去頂鍋汉额,開除。
對(duì)比
強(qiáng)引用 never (回收時(shí)機(jī)) 對(duì)象的一般狀態(tài) JVM停止運(yùn)行(終止)
軟引用 內(nèi)存不足時(shí)候 對(duì)象緩存 內(nèi)存不足
弱引用 GC時(shí) 對(duì)象緩存 JVM結(jié)束
虛引用 榨汤。蠕搜。。 收壕。妓灌。。 蜜宪。虫埂。。
GC
jstack