引用類型

引用類型

在java中提供了四個級別的引用,分別是強引用,軟引用,弱引用,虛引用。在這四種引用級別中,只有強引用FinalReference類是包內可見的,其它三種引用類型,均爲public。可以在應用程序內直接使用。
引用類型
強引用
通過引用可以對堆中的對象進行操作,在某函數中,當創建了一個對象,該對象被分配在堆中,通過這個對象的引用,才能對這個對象進行操作。
StringBuffer sb=new StringBuffer(“Hello World”);
假設以上代碼是在函數體運行的,那麼局部變量sb被分配到棧上,而對象StringBuffer的實例,被分配到堆上,局部變量str指向StringBuffer實例所在的堆空間。通過sb可以操作該實例,那麼str就是StringBuffer的引用。
強引用實例
如果運行一個賦值語句:
StringBuffer str=sb;
那麼sb所指向的對象也將被str所指向,同時在局部棧空間上,會分配空間存放str這個引用變量,此時,實例StringBuffer就有兩個引用。“==”操作符這時的意義就是表示兩個操作數所指向堆空間的地址是否相同,不表示兩個操作數所指向的對象是否相等。
強引用示例
兩個引用都是強引用,強引用具備以下特點:

  • 強引用可以直接訪問目標對象。
  • 強引用所指向的對象在任何時候都不會被系統回收,JVM寧願拋出OOM異常。也不回收強引用所指的對象。
  • 強引用可能導致內存泄漏。

軟引用
軟引用是除了強引用外,最強的引用類型,一個持有軟引用的對象,不會被JVM很快回收,JVM會根據當前堆的使用情況判斷何時回收,當堆使用率臨近閾值時,纔會去回收軟引用對象。只要有足夠的內存,軟引用便可能在內存中存活相當長的一段時間,因此,軟引用可以實現對內存敏感的Cache。

軟引用用法:
SoftReference<String> sr=new SoftReference<String>(new String("hello"));
System.out.println(sr.get());
//sr.get()是調用強引用
當系統內存不足的時候軟引用就會被回收

弱引用
弱引用是一種比軟引用弱的引用類型,在系統GC時,只要發現弱引用,不管系統堆空間是否足夠,都會將對象進行回收,但是由於垃圾回收器的線程優先級很低,因此,並不一定很快發現有弱引用對象,在這種情況下弱引用對象可以存在較長的時間,一旦一個弱引用對象被垃圾回收器回收,便會加入到一個註冊引用隊列中。

WeakReference<String> wr=new WeakReference<String>(new String("aa"));
		System.out.println(wr.get());
		System.gc();
		System.out.println(wr.get());
結果:
aa
null
在GC之前存在引用,之後就被垃圾回收器回收了。

軟引用和弱引用都非常適合保存那些可有可無的緩存數據,如果這麼做,當系統內存不足時,這些緩存數據
會被回收,不會導致內存溢出,而當內存資源充足時,這些緩存數據又可以存在相當長的時間,從而起到加速
系統的作用。

虛引用
虛引用是所有引用最弱的一個,一個持有虛引用的對象,和沒有引用幾乎是一樣的,隨時都可能被垃圾回收器回收。當試圖通過虛引用的get()方法取得強引用時,總會失敗。並且虛引用必須和引用隊列一起使用,它的作用在於跟蹤垃圾回收過程。
當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在垃圾回收後,銷燬這個對象,將這個虛引用加入引用隊列。

PhantomReference<String> pt=new PhantomReference<String>(str, null);
		System.out.println(pt.get());
		System.gc();
		System.out.println(pt.get());
結果:
null
null
在這個輸出結果可以看出,對虛引用的get操作,總是返回null,即便強引用還存在時也不例外,因爲虛引用
的get()實現如下:

get方法

WeakHashMap類及實現
WeakHashMap類在java.util包內,它實現了Map接口,是HashMap的一種實現,它使用弱引用作爲內部存儲方案,WeakHashMap是弱引用的一種典型應用,它可以作爲一種簡單的緩存表解決方案。
WeakHashMap會在系統內存緊張時,使用弱引用,自動釋放掉持有弱引用的內存數據.
如果希望在系統中通過WeakHashMap自動清理數據,就儘量不要在WeakHashMap使用強引用的key,因爲這些強引用的key不會被回收,這樣WeakHashMap的功能就會退化成HashMap,那麼所有的表項就無法被清理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章