無論是通過計數算法判斷對象的引用數量,還是通過根搜索算法判斷對象引用鏈是否可達,判定對象是否存活都與“引用”相關。
引用主要分爲 :強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(PhantomReference) 四種,引用的強度依次驟減。
強引用:
就是指在代碼之中普遍存在的,類似:“Object objectRef = new Obejct”,這種引用,只要強引用還存在,永遠不會被GC清理。
軟引用:
用來描述一些還有用,但並非必須存在的對象,當Jvm內存不足時(內存溢出之前)會被回收,如果執行GC後,還是沒有足夠的空間,纔會拋出內存溢出異常。
通過SoftReference類來實現軟引用,SoftReference很適合用於實現緩存。另,當GC認爲掃描的SoftReference不經常使用時,可會進行回收。
使用方法:
User user = new User();
SoftReference<Object> softReference = new SoftReference<Object>(user);
softReference.get();
弱引用
弱引用也是用來描述一些還有用,但並非必須存在的對象,它的強度會被軟引用弱些,被弱引用關聯的對象,只能生存到下一次GC前,當GC工作時,無論內存是否足夠,都會回收掉弱引用關聯的對象。JDK通過WeakReference類來實現。
當獲取時,可通過weakReference.get方法獲取,可能返回null
可傳入一個ReferenceQueue對象到WeakReference構造,當引用對象被表示爲可回收時,isEnqueued返回true
User user = new User();
WeakReference<User> weakReference = new WeakReference<User>(user);
weakReference.get();
ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>();
WeakReference<User> weakReference2 = new WeakReference<User>(user, referenceQueue);
//當引用對象被標識爲可回收時 返回true, 即當user對象標識爲可回收時,返回true
weakReference.isEnqueued();
虛引用
虛引用稱爲“幻影引用”,它是最弱的一種引用關係,一個對象是否有虛引用的存在,完全不會對生存時間構成影響。爲一個對象設置虛引用關聯的唯一目的就是希望能在這個對象被GC回收時收到一個系統通知。通過PhantomReference類實現。
值得注意的是:phantomReference.get方法永遠返回null, 當user從內存中刪除時,調用isEnqueued會返回true
User user = new User();
ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>();
PhantomReference<User> phantomReference = new PhantomReference<User>(user, referenceQueue);
//即當user對象標識爲可回收時,返回true
System.out.println(phantomReference.isEnqueued());
//永遠返回null
System.out.println(phantomReference.get());
其他相關類:
WeakCache weakCache = new WeakCache();
SoftCache softCache = new SoftCache();
WeakHashMap weakHashMap = new WeakHashMap();
當垃圾回收機制運行,掃描引用關係,GC會對這三種類型的引用進行不同的處理,簡單來說,GC首先會判斷所掃描到的引用是否爲Reference類型,如果爲Reference類型,且其所引用的對象無強引用,則認爲該對象爲相應的Reference類型,之後GC在垃圾回收時這些對象則根據Reference類型的不同進行相應處理。
本文原文鏈接:http://blog.csdn.net/java2000_wl/article/details/8090276 轉載請註明出處!