1. 程式人生 > >Java中四種引用強 軟 弱 虛 的詳細介紹及理解

Java中四種引用強 軟 弱 虛 的詳細介紹及理解

 Java中強軟弱虛四種引用

一:引用的目的:

在Java中垃圾回收器的執行是JVM操作的,但是我們仍然可以在一定程度上與垃圾回收器進行互動,其目的在於更好的幫助垃圾回收器管理好應用的記憶體避免記憶體出現OOM這種互動方式就是使用JDK 1.2引入的java.lang.ref包,為物件指定不同的引用型別。

Object obj = new Object()        obj指向的是Object()物件在記憶體中的地址。可以通過obj可以操控物件一些操作。

一、強引用StrongReference

  當我們使用 new 這個關鍵字建立物件時創建出來的物件就是強引用(new出來物件為強引用)  如Object obj = new Object()   這個obj就是一個強引用了,如果一個物件具有強引用。垃圾回收器就不會回收

有強引用的物件。如當jvm記憶體不足時,具備強引用的物件,虛擬機器寧可丟擲OutOfMemoryError(記憶體空間不足),使程式終止,也不會靠垃圾回收器去回收該物件來解決記憶體

二、軟引用(SoftReference)

如果一個物件只具有軟引用,那就類似於可有可物的生活用品。如果記憶體空間足夠,垃圾回收器就不會回收它,如果記憶體空間不足了,就會回收這些物件的記憶體。只要垃圾回收器沒有回收它,該物件就可以被程式使用。

軟引用的作用:軟引用可用來實現記憶體敏感的快取記憶體。
軟引用可以和一個引用佇列(ReferenceQueue)聯合使用,如果軟引用所引用的物件被垃圾回收,Java虛擬機器就會把這個軟引用加入到與之關聯的引用佇列中。

三、弱引用WeakReference

如果一個物件只具有弱引用,那就類似於可有可物的生活用品。弱引用與軟引用的區別在於:只具有弱引用的物件擁有更短暫的生命週期。在垃圾回收器執行緒掃描它所管轄的記憶體區域的過程中,一旦發現了只具有弱引用的物件,不管當前記憶體空間足夠與否,都會回收它的記憶體。不過,由於垃圾回收器是一個優先順序很低的執行緒, 因此不一定會很快發現那些只具有弱引用的物件。 
弱引用可以和一個引用佇列(ReferenceQueue)聯合使用,如果弱引用所引用的物件被垃圾回收,Java虛擬機器就會把這個弱引用加入到與之關聯的引用佇列中。

四、虛引用PhantomReference
虛引用顧名思義,就是形同虛設,和其他幾種引用都不同,虛引用並不會決定物件的生命週期。如果一個物件僅持有  虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。 虛引用主要用來跟蹤物件被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用佇列ReferenceQueue)聯合使用。當垃圾回收器準備回收一個物件時,如果發現它還有虛引用,就會在回收物件的記憶體之前,把這個虛引用加入到與之 關聯的引用佇列中。 ReferenceQueue queue = new ReferenceQueue (); //虛引用物件 PhantomReference pr = new PhantomReference (objectqueue); 程式可以通過判斷引用佇列中是否已經加入了虛引用,來了解被引用的物件是否將要被垃圾回收。如果程式發現某個虛引用已經被加入到引用佇列,那麼就可以在所引用的物件的記憶體被回收之前採取必要的行動。