首頁  >  文章  >  Java  >  Java虛擬機器學習 - 物件引用強度

Java虛擬機器學習 - 物件引用強度

黄舟
黄舟原創
2017-02-17 10:34:021401瀏覽

無論是透過計數演算法判斷物件的引用數量,或是透過根搜尋演算法判斷物件引用鍊是否可達,判定物件是否存活都與「引用」相關。

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

強引用:


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

軟引用:

用來描述一些還有用,但並非必須存在的對象,當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

虛引用

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

值得注意的是:phantomReference.get方法永遠回傳null, 當user從記憶體中刪除時,呼叫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();


		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類型的不同進行對應處理。

 以上就是Java虛擬機器學習 - 物件引用強度的內容,更多相關內容請關注PHP中文網(www.php.cn)!



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn