天天看點

Java四種引用方式

一、 四種引用類型

1. 強引用

我們像這樣直接聲明的一個引用都是強引用。

如果一個對象隻被強引用方式引用,隻有當這個對象的所有引用都失效(主動或者被動置空),這個對象才可以被GC回收(置空的對象并非立即被回收,當GC輪詢到該對象發現其為空時才會主動回收它,不過我們可以調用System.gc()主動通知GC輪詢)。

2. 軟引用

Object obj = new Object();
SoftReference<Object> softRef = new SoftReference<Object>(obj);
           

通過SoftReference構造一個軟引用,也可放入引用隊列作為第二個構造參數,軟引用被回收之前,會被放入該引用隊列中。

軟引用在OOM之前會被GC主動回收,之後調用softRef.get()傳回的null,而在記憶體充足時,不會被回收,是以傳回的是obj。

軟引用屬于可有可無的引用,常用于記憶體上做高速緩存資料。

3. 弱引用

Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<Object>(obj);
           

通過WeakReference構造一個弱引用,也可放入引用隊列作為第二個構造參數,弱引用被回收之前,會被放入該引用隊列中。

弱引用用于解決持有引用的對象生命周期大于該引用,導緻記憶體洩漏的問題,例如非靜态内部類的執行個體持有外部類的強引用,當外部類的執行個體被銷毀時,由于内部類還持有該引用,則無法及時回收外部類執行個體。

4. 虛引用

Object obj = new Object();
ReferenceQueue refQueue = new ReferenceQueue();
PhantomReference<Object> phantomRef = new PhantomReference<Object>(obj, refQueue);
           

通過PhantomReference構造一個虛引用,構造時必須傳入一個引用隊列,虛引用被回收之前,會被放入該引用隊列中。

虛引用屬于虛假的引用,在僅被虛引用的前提下,GC輪詢到虛引用指向的對象時,一定會回收該對象。是以我們可以通過判斷引用隊列中是否存在該引用,進而得知該引用是否即将被回收。

二、 強弱關系

四種引用方式強弱關系依次遞減:

強引用 > 軟引用 > 弱引用 > 虛引用

三、參考文獻

  • Java四種引用包括強引用,軟引用,弱引用,虛引用。
  • java強引用、軟引用、弱引用、虛引用