1. 程式人生 > >java 強引用 軟引用 弱引用 虛引用 以及引用佇列的使用

java 強引用 軟引用 弱引用 虛引用 以及引用佇列的使用

參考https://blog.csdn.net/u011936381/article/details/11709245

一、強引用:

物件的引用被至少一個變數所把持,此時該物件引用就是強引用,jvm無論怎麼樣都不會回收強引用,除非再也沒有任何變數繼續把持該引用。

二、軟引用、弱引用、虛引用的使用都需要配合SoftReference、WeekReference、PhantomReference才能使用。

這三者的概念:

軟引用:當記憶體不足時才會回收,其他情況下不會回收。

弱引用:當垃圾回收期檢測到弱引用時會回收,沒檢測到則不會回收。

虛引用:隨時會回收,一般用於判斷虛擬機器回收情況,而且必須與引用佇列一起用,否則沒效果,前面兩種可以不與引用佇列一起用(最好還是一起用)。

 

三者使用方式差不多,這裡只介紹一種,比如軟引用:

MyObject aRef = new MyObject();

SoftReference aSoftRef = new SoftReference(aRef); 

在這個時候,aRef變數還拿著MyObjet物件的引用,此時這引用是強引用,同時該引用還傳給了SoftReference 的物件aSoftRef 

接著執行  aRef =null;

此時aRef變數沒有再把持該引用了,這個時候該物件引用被SoftReference物件aSoftRef 把持著,那就是軟引用。

這個時候MyObjet物件的引用只有當記憶體不足時才會被垃圾回收器回收。

另外兩種引用使用方式與這差不多。

 

三、引用佇列

 作為一個Java物件,SoftReference物件除了具有儲存軟引用的特殊性之外,也具有Java物件的一般性。所以,當軟可及物件被回收之後,雖然這個SoftReference物件的get()方法返回null,但這個SoftReference物件已經不再具有存在的價值,需要一個適當的清除機制,避免大量SoftReference物件帶來的記憶體洩漏。在java.lang.ref包裡還提供了ReferenceQueue。如果在建立SoftReference物件的時候,使用了一個ReferenceQueue物件作為引數提供給SoftReference的構造方法,如:

ReferenceQueue queue = new ReferenceQueue();

SoftReference ref = new
SoftReference(aMyObject, queue); 

那麼當這個SoftReference所軟引用的aMyOhject被垃圾收集器回收的同時,ref所強引用的SoftReference物件被列入ReferenceQueue。也就是說,ReferenceQueue中儲存的物件是Reference物件,而且是已經失去了它所軟引用的物件的Reference物件。另外從ReferenceQueue這個名字也可以看出,它是一個佇列,當我們呼叫它的poll()方法的時候,如果這個佇列中不是空佇列,那麼將返回佇列前面的那個Reference物件。
在任何時候,我們都可以呼叫ReferenceQueue的poll()方法來檢查是否有它所關心的非強可及物件被回收。如果佇列為空,將返回一個null,否則該方法返回佇列中前面的一個Reference物件。利用這個方法,我們可以檢查哪個SoftReference所軟引用的物件已經被回收。於是我們可以把這些失去所軟引用的物件的SoftReference物件清除掉。常用的方式為:

SoftReference ref = null;

while ((ref = (EmployeeRef) q.poll()) != null) {

// 清除ref

}