無論是透過計數演算法判斷物件的引用數量,或是透過根搜尋演算法判斷物件引用鍊是否可達,判定物件是否存活都與「引用」相關。
引用主要分為 :強引用(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
虛引用
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)!