Java虛擬機學習 - 對象引用強度

無論是通過計數算法判斷對象的引用數量,還是通過根搜索算法判斷對象引用鏈是否可達,判定對象是否存活都與“引用”相關。

引用主要分爲 :強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(PhantomReference) 四種,引用的強度依次驟減。

強引用:


就是指在代碼之中普遍存在的,類似:“Object objectRef = new Obejct”,這種引用,只要強引用還存在,永遠不會被GC清理。

軟引用:

用來描述一些還有用,但並非必須存在的對象,當Jvm內存不足時(內存溢出之前)會被回收,如果執行GC後,還是沒有足夠的空間,纔會拋出內存溢出異常。

通過SoftReference類來實現軟引用,SoftReference很適合用於實現緩存。另,當GC認爲掃描的SoftReference不經常使用時,可會進行回收。

使用方法:


  1. User user = new User();  

  2. SoftReference<Object> softReference  = new SoftReference<Object>(user);  

  3. softReference.get();  

弱引用

弱引用也是用來描述一些還有用,但並非必須存在的對象,它的強度會被軟引用弱些,被弱引用關聯的對象,只能生存到下一次GC前,當GC工作時,無論內存是否足夠,都會回收掉弱引用關聯的對象。JDK通過WeakReference類來實現。

當獲取時,可通過weakReference.get方法獲取,可能返回null

可傳入一個ReferenceQueue對象到WeakReference構造,當引用對象被表示爲可回收時,isEnqueued返回true


  1.              User user = new User();  

  2. WeakReference<User> weakReference = new WeakReference<User>(user);  

  3. weakReference.get();  

  4. ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>();  

  5. WeakReference<User> weakReference2 = new WeakReference<User>(user, referenceQueue);  

  6. //當引用對象被標識爲可回收時  返回true,  即當user對象標識爲可回收時,返回true

  7. weakReference.isEnqueued();  

虛引用

虛引用稱爲“幻影引用”,它是最弱的一種引用關係,一個對象是否有虛引用的存在,完全不會對生存時間構成影響。爲一個對象設置虛引用關聯的唯一目的就是希望能在這個對象被GC回收時收到一個系統通知。通過PhantomReference類實現。

值得注意的是:phantomReference.get方法永遠返回null, 當user從內存中刪除時,調用isEnqueued會返回true


  1. User user = new User();  

  2. ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>();  

  3. PhantomReference<User>  phantomReference = new PhantomReference<User>(user, referenceQueue);  

  4. //即當user對象標識爲可回收時,返回true

  5. System.out.println(phantomReference.isEnqueued());  

  6. //永遠返回null

  7. System.out.println(phantomReference.get());  

其他相關類:


  1. WeakCache weakCache  = new WeakCache();  

  2. SoftCache softCache = new SoftCache();  

  3. WeakHashMap weakHashMap  = new WeakHashMap();  


 當垃圾回收機制運行,掃描引用關係,GC會對這三種類型的引用進行不同的處理,簡單來說,GC首先會判斷所掃描到的引用是否爲Reference類型,如果爲Reference類型,且其所引用的對象無強引用,則認爲該對象爲相應的Reference類型,之後GC在垃圾回收時這些對象則根據Reference類型的不同進行相應處理。

本文原文鏈接:http://blog.csdn.net/java2000_wl/article/details/8090276 轉載請註明出處!


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