在Java中引用包括:
- FinalReference 強引用
- SoftReference 軟引用
- WeakReference 弱引用
- PhantomReference 虛引用
那么為什么會提供這四種引用呢派近,主要原因有:
- 方便Jvm進行垃圾回收
- 方便開發(fā)人員使用案疲,開發(fā)人員可以靈活的決定某些對象的生命周期
FinalReference 強引用
類似于 Object o = new Object() 這類的引用酌予,創(chuàng)建一個對象后爷贫,該引用會被保存在JVM棧中诗茎,而且只要強引用存在锭环,垃圾回收器就不會回收掉被引用的對象驮肉。
強引用的例子比比皆是涣雕,因為在日常開發(fā)中我們是會經(jīng)常去new一個對象的全释,而該new出來的對象便是強引用的装处,也就是說只要該引用存在,垃圾回收器就不會回收掉浸船。 【劃重點:JVM怎么知道引用在不在妄迁?】
JVM怎么知道引用在不在
關(guān)于JVM怎么知道引用在不在寝蹈,這就涉及到了JVM的可達性分析算法了 JVM的可達性分析算法的簡單思路就是通過一系列GC Roots作為出發(fā)點,向下搜索登淘,搜索所走過的路徑稱為引用鏈箫老,當一個對象到GC Roots沒有任何引用鏈,即表明從GC Roots到這個對象不可達時形帮,證明此對象不可用槽惫,可被回收。
SoftReference 軟引用
軟引用關(guān)聯(lián)的對象辩撑,在內(nèi)存不夠的情況下界斜,會把這些軟引用關(guān)聯(lián)的對象列入垃圾回收范圍中,然后進行回收合冀,也就是說軟引用并非是完全安全的各薇,在內(nèi)存不夠的情況下是會被垃圾回收器回收掉的。
部分是使用軟引用來保存從數(shù)據(jù)庫中取出的數(shù)據(jù)君躺,具體是做了一個中間層的封裝峭判,該中間層的作用就是在get出數(shù)據(jù)的時候會去判斷數(shù)據(jù)是否為null,如果是為null再次從數(shù)據(jù)庫讀取棕叫,讀取后再放入軟引用的集合中林螃,這樣的做法是可以避免內(nèi)存溢出。
WeakReference 弱引用
弱引用比軟引用更弱俺泣,被弱引用關(guān)聯(lián)的對象只能存活到發(fā)生下一次垃圾回收之前疗认,也就是說當發(fā)生GC時,無論當前內(nèi)存是否足夠伏钠,都會被回收掉横漏。
PhantomReference 虛引用
虛引用和上面不同的地方在于,一個對象是否有虛引用的存在熟掂,完全不會對其生存時間構(gòu)成如何影響缎浇,并且也無法通過虛引用來獲取一個對象的實例,也就是說跟沒有引用與之關(guān)聯(lián)一樣赴肚,在任何時候都可能被垃圾回收器回收素跺。
那么這樣就很容易產(chǎn)生疑問了,虛引用的作用又是什么呢誉券?
作用就是能在這個對象被收集器回收時收到一個系統(tǒng)通知指厌,實現(xiàn)追蹤垃圾收集器的回收動作,比如在對象被回收的時候横朋,會調(diào)用該對象的finalize方法仑乌。
ReferenceQueue 引用隊列
ReferenceQueue 引用其實也可以歸納為引用中的一員,可以和上述三種引用類型組合使用【軟引用、弱引用晰甚、虛引用】衙传。
那么它有何作呢?
在創(chuàng)建Reference時厕九,手動將Queue注冊到Reference中蓖捶,而當該Reference所引用的對象被垃圾收集器回收時,JVM會將該Reference放到該隊列中扁远,而我們便可以對該隊列做些其他業(yè)務(wù)俊鱼,相當于一種通知機制。