1. 程式人生 > >面試題之---java四種引用

面試題之---java四種引用

,java的4種引用方式

JDK 1.2以前的版本中,若一個物件不被任何變數引用,那麼程式就無法再使用這個物件。也就是說,只有物件處於可觸及(reachable)狀態,程式才能使用它。從JDK 1.2版本開始,把物件的引用分為4種級別,從而使程式能更加靈活地控制物件的生命週期。這4種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。

目的:

1,可以讓程式設計師通過程式碼的方式決定某些物件的生命週期;

2,有利於JVM進行垃圾回收。

(一)強引用(Strong Reference)

1,最普遍的引用,當記憶體不足時,寧可跑出OOM異常,垃圾回收器也不會回收它.

(二)軟引用(Soft Reference)

 1,記憶體足夠,就不會回收它;但記憶體不夠的時候,垃圾回收器就會回收它.軟引用的存在不妨礙垃圾收集執行緒對該Java物件的回收

  2,如果軟引用所引用的物件被垃圾回收器回收,Java虛擬機器就會把這個軟引用加入到與之關聯的引用佇列中.

  3,作用:實現記憶體敏感的快取記憶體,比如網頁快取、圖片快取等.

//軟引用String str = new String("hello");SoftReference<String> sf = new SoftReference<String>(str);str = null;sf.get();//獲取物件,但當這個物件被標記為需要回收的物件時,則返回

null

(三)弱引用(Weak Reference)

和軟引用相比,生命週期更短.只要它在垃圾回收器掃描的區域中,被掃描到,就會被回收,不管記憶體是否足夠.

弱引用可以和一個引用佇列(ReferenceQueue)聯合使用,如果弱引用所引用的物件唄垃圾回收器回收,那麼Java虛擬機器就會把這個弱引用加入到與之相關的引用佇列中.

//弱引用String str = new String("hello");WeakReference<String> wf = new WeakReference<String>(str);str = null;wf.get();//有時候會返回nullwf.isEnQueued();

//弱引用的isEnQueued方法返回物件是否被垃圾回收器標記。

(四)虛引用

主要用於跟蹤垃圾回收器回收物件的活動.

虛引用並不會決定物件的生命週期,且必須和引用佇列聯合使用.

當垃圾回收器準備回收一個物件時,如果發現它還有虛引用,就會在回收物件的記憶體之前,把這個虛引用加入到與之關聯的引用佇列中.

程式就可以通過判斷引用佇列中是否已經加入了虛引用,來了解被引用的物件是否將要被垃圾回收器回收.

String str = new String("hello");PhantomReference<String> pf = new PhantomReference<String>(str);str=null;pf.get();//永遠返回nullpf.isEnQueued();//返回是否從記憶體中已經刪除

ReferenceQueue<String> rq = new ReferenceQueue<String>();WeakReference<String> wf = new WeakReference<String>(str, rq);str=null;//兩次催促垃圾回收器工作,提高“hello”物件被回收的可能性 System.gc();System.gc();String str1=wf.get();

為了防止記憶體溢位,在處理一些佔用記憶體比較大而且生命週期較長的物件時,可以儘量使用軟引用和弱引用.