国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

基于Java 2平臺的引用類使用指南

2019-11-18 10:41:25
字體:
來源:轉載
供稿:網友

  java 2 平臺引入了 java.lang.ref 包,其中包括的類可以讓您引用對象,而不將它們留在內存中。這些類還提供了與垃圾收集器(garbage collector)之間有限的交互。Peter Haggar 在本文中分析了 SoftReference、WeakReferencePhantomReference 類的功能和行為,并就這些類的使用給出了一些編程風格上的建議。

  當在 Java 2 平臺中首次引入 java.lang.ref 包(其中包含 SoftReferenceWeakReferencePhantomReference 類)時,它的實用性顯然被過分夸大了。它包含的類可能是有用的,但這些類具有的某些局限性會使它們顯得不是很有吸引力,而且其應用程序也將非凡局限于解決一類特定的問題。

  垃圾收集概述

  引用類的主要功能就是能夠引用仍可以被垃圾收集器回收的對象。在引入引用類之前,我們只能使用強引用(strong reference)。舉例來說,下面一行代碼顯示的就是強引用 obj


Object obj = new Object();

  obj 這個引用將引用堆中存儲的一個對象。只要 obj 引用還存在,垃圾收集器就永遠不會釋放用來容納該對象的存儲空間。

  當 obj 超出范圍或被顯式地指定為 null 時,垃圾收集器就認為沒有對這個對象的其它引用,也就可以收集它了。然而您還需要注重一個重要的細節(jié):僅憑對象可以被收集并不意味著垃圾收集器的一次指定運行就能夠回收它。由于各種垃圾收集算法有所不同,某些算法會更頻繁地分析生存期較短的對象,而不是較老、生存期較長的對象。因此,一個可供收集的對象可能永遠也不會被回收。假如程序在垃圾收集器釋放對象之前結束,這種情況就可能會出現(xiàn)。因此,概括地說,您永遠無法保證可供收集的對象總是會被垃圾收集器收集。

這些信息對于您分析引用類是很重要的。由于垃圾收集有著特定的性質,所以引用類實際上可能沒有您原來想像的那么有用,盡管如此,它們對于特定問題來說還是很有用的類。軟引用(soft reference)、弱引用(weak reference)和虛引用(phantom reference)對象提供了三種不同的方式來在不妨礙收集的情況下引用堆對象。每種引用對象都有不同的行為,而且它們與垃圾收集器之間的交互也有所不同。此外,這幾個新的引用類都表現(xiàn)出比典型的強引用“更弱”的引用形式。而且,內存中的一個對象可以被多個引用(可以是強引用、軟引用、弱引用或虛引用)引用。在進一步往下討論之前,讓我們來看看一些術語:

  • 強可及對象(strongly reachable):可以通過強引用訪問的對象。

  • 軟可及對象(softly reachable):不是強可及對象,并且能夠通過軟引用訪問的對象。

  • 弱可及對象(weakly reachable):不是強可及對象也不是軟可及對象,并且能夠通過弱引用訪問的對象。

  • 虛可及對象(phantomly reachable):不是強可及對象、軟可及對象,也不是弱可及對象,已經結束的,可以通過虛引用訪問的對象。

  • 清除:將引用對象的 referent 域設置為 null,并將引用類在堆中引用的對象聲明為可結束的。

  SoftReference 類

  SoftReference 類的一個典型用途就是用于內存敏感的高速緩存。SoftReference 的原理是:在保持對對象的引用時保證在 JVM 報告內存不足情況之前將清除所有的軟引用。要害之處在于,垃圾收集器在運行時可能會(也可能不會)釋放軟可及對象。對象是否被釋放取決于垃圾收集器的算法以及垃圾收集器運行時可用的內存數(shù)量。

  WeakReference 類

  WeakReference 類的一個典型用途就是規(guī)范化映射(canonicalized mapping)。另外,對于那些生存期相對較長而且重新創(chuàng)建的開銷也不高的對象來說,弱引用也比較有用。要害之處在于,垃圾收集器運行時假如碰到了弱可及對象,將釋放 WeakReference 引用的對象。然而,請注重,垃圾收集器可能要運行多次才能找到并釋放弱可及對象。

  PhantomReference 類

  PhantomReference 類只能用于跟蹤對被引用對象即將進行的收集。同樣,它還能用于執(zhí)行 PRe-mortem 清除操作。PhantomReference 必須與 ReferenceQueue 類一起使用。需要 ReferenceQueue 是因為它能夠充當通知機制。當垃圾收集器確定了某個對象是虛可及對象時,PhantomReference 對象就被放在它的 ReferenceQueue 上。將 PhantomReference 對象放在 ReferenceQueue 上也就是一個通知,表明 PhantomReference 對象引用的對象已經結束,可供收集了。這使您能夠剛好在對象占用的內存被回收之前采取行動。



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 汤原县| 阜平县| 永德县| 新竹县| 嵩明县| 富顺县| 长沙县| 新沂市| 阿坝| 朝阳县| 建德市| 高州市| 德州市| 犍为县| 江门市| 安达市| 凯里市| 淄博市| 永靖县| 平原县| 罗江县| 乌苏市| 潞城市| 新野县| 洛扎县| 桐庐县| 浑源县| 陵水| 滦南县| 巴彦淖尔市| 安西县| 潼关县| 马山县| 怀化市| 昭觉县| 九江市| 鹤峰县| 会同县| 焦作市| 海林市| 鹤岗市|