在java中,有四種引用边酒,分別為強引用经柴、軟引用、弱引用與虛引用墩朦,它們有各自不同的特性坯认,使用場景也各不相同,下面我就對他們分別作出說明氓涣。
強引用
強引用是最普遍的引用鹃操。如果對象具有強引用,那么垃圾回收器絕不會回收它春哨。當內(nèi)存空間不足時,jvm寧愿OOM也不會隨意回收具有強引用的對象恩伺。如果強引用的對象不使用時赴背,需要將它弱化從而使GC能夠回收它。比如顯示的將它置為null;或者讓其超出對象的生命周期范圍凰荚,那么GC就認為該對象不存在引用燃观,這時就能回收它了。具體什么時候回收就要取決于GC算法了便瑟。
public void test(){
// 強引用
Object strongReference = new Object();
}
在一個方法內(nèi)部有一個強引用缆毁,這個引用保存在棧中,而引用的對象保存在堆中到涂。當這個方法運行完成后脊框,就會退出方法棧,引用對象的引用數(shù)就是0践啄,這個對象就可以被回收浇雹。
但是如果這個對象是全局變量時,就需要在不使用時將其置為null屿讽,否則無法被垃圾回收昭灵。
軟引用
如果一個對象只具有軟引用,則內(nèi)存空間充足時伐谈,垃圾回收不會回收它烂完;如果內(nèi)存空間不足時,就會回收這些對象诵棵。只要垃圾回收沒有回收它抠蚣,該對象就可以被程序使用。
// 強引用
String strongReference = new String("123");
// 軟引用
String str = new String("123");
SoftReference<String> softReference = new SoftReference<>(str);
當內(nèi)存不足時非春,jvm會首先將軟引用的對象引用置為null柱徙,然后通知垃圾回收器進行回收。而且jvm會盡可能的優(yōu)先回收長時間閑置不用的軟引用對象奇昙。對那些剛構(gòu)建或剛使用過的軟引用對象會盡可能保留护侮。為此引入了引用隊列(ReferenceQueue)的概念。如果軟引用的對象被垃圾回收储耐,jvm就會把這個軟引用加入到與之關(guān)聯(lián)的引用隊列中羊初。
弱引用
弱引用與軟引用的區(qū)別在于:只具有弱引用的對象擁有更短的生命周期。在垃圾回收器進行掃描時什湘,一旦發(fā)現(xiàn)只有弱引用的對象长赞,不管內(nèi)存空間是否充足,都會回收它闽撤。不過得哆,垃圾回收器是一個優(yōu)先級很低的線程,因此不一定很快就能發(fā)現(xiàn)那些只有弱引用的對象哟旗。
// 弱引用
String str = new String("123");
WeakReference<String> weakReference = new WeakReference<>(str);
如果一個對象很少被使用贩据,并且希望在使用時隨時就能獲得栋操,但又不想影響此對象的垃圾回收,那么就可以用WeakReference來記住此對象饱亮。
如果你希望將一個弱引用變成強引用矾芙,可以使用weakReference.get();
// 弱引用
String str = new String("123");
WeakReference<String> weakReference = new WeakReference<>(str);
// 弱引用轉(zhuǎn)強引用
String strongReference = weakReference.get();
同樣,如弱引用的對象被垃圾回收近上,jvm就會把這個弱引用加入到與之關(guān)聯(lián)的引用隊列中剔宪。
虛引用
虛引用顧名思義,就是形同虛設(shè)壹无。虛引用并不會決定對象的生命周期葱绒,如果一個對象只有虛引用,那它就和沒有任何引用一樣格遭,在任何時候都可以被垃圾回收器回收哈街。
虛引用必須和引用隊列聯(lián)合使用。當垃圾回收器回收一個對象時拒迅,如果發(fā)現(xiàn)他有虛引用骚秦,就會在回收對象前,把虛引用加入與之關(guān)聯(lián)的引用隊列中璧微。
String str = new String("123");
// 引用隊列
ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
// 虛引用
PhantomReference<String> phantomReference = new PhantomReference<>(str,referenceQueue);
虛引用主要用來跟蹤對象被垃圾回收的活動作箍。程序可以通過判斷引用隊列中是否已經(jīng)加入了虛引用,來了解被引用的對象是否要進行垃圾回收前硫。如果程序發(fā)現(xiàn)某個虛引用已經(jīng)被加入到引用隊列胞得,那么就可以在所引用的對象的內(nèi)存被回收之前采取必要的行動。
總結(jié)
引用級別強 -> 弱 : 強引用 -> 軟引用 -> 弱引用 -> 虛引用
引用類型 | 被垃圾回收時間 | 用途 | 生存時間 |
---|---|---|---|
強引用 | 從不會 | 對象的一般狀態(tài) | jvm終止 |
軟引用 | 內(nèi)存不足時屹电,先回收長時間不用的 | 對象緩存 | 內(nèi)存不足 |
弱引用 | 垃圾回收時 | 對象緩存 | 垃圾回收 |
虛引用 | 垃圾回收時 | 跟蹤對象的垃圾回收 | 垃圾回收 |