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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

對(duì)象死了嗎?

2019-11-15 00:01:09
字體:
供稿:網(wǎng)友
對(duì)象死了嗎?

垃圾收集器在對(duì)堆進(jìn)行回收前,需要先判斷堆中哪些對(duì)象是“活著”的,哪些對(duì)象是“死了”的。

1.引用計(jì)數(shù)法

  給對(duì)象添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器加1,當(dāng)引用失效時(shí),計(jì)數(shù)器減1。任何時(shí)刻計(jì)數(shù)器為0的對(duì)象就是不可能再被使用的。

  引用計(jì)數(shù)器實(shí)現(xiàn)簡單,效率高。但是主流的JVM并沒有使用引用計(jì)數(shù)法來管理內(nèi)存,主要原因是它難以解決對(duì)象之間循環(huán)引用的問題。例如,對(duì)象objA和對(duì)象objB都有字段instance,令objA.instance=objB,objB.instance=objA,除此之外這兩個(gè)對(duì)象再無任何引用,實(shí)際上這兩個(gè)對(duì)象再無可能被訪問,但是因?yàn)閮蓚€(gè)對(duì)象之間互相引用,兩者的引用計(jì)數(shù)器都不為0,引用計(jì)數(shù)法無法回收這兩個(gè)對(duì)象。

2.可達(dá)性分析算法

  JVM的主流實(shí)現(xiàn)是通過可達(dá)性分析來判斷對(duì)象是否存活的。這個(gè)算法的基本思路是通過一系列的稱為“GC Roots”的對(duì)象作為起點(diǎn),從這些起點(diǎn)開始向下搜索,搜索所走過的路徑稱為引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈時(shí),證明此對(duì)象是不可用的,將會(huì)成為可回收的對(duì)象。

  java中,可作為GC Roots的對(duì)象包括:

  • 虛擬機(jī)棧中引用的對(duì)象
  • 方法區(qū)中類靜態(tài)屬性引用的對(duì)象
  • 方法區(qū)中常量引用的對(duì)象
  • Native方法引用的對(duì)象

3.引用

  引用可以分為強(qiáng)引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)和虛引用(Phantom Reference)四種。

  • 強(qiáng)引用是指代碼中普遍存在的,類似“Object obj=new Object()”這類的引用,只要強(qiáng)引用還存在,被引用的對(duì)象就永遠(yuǎn)不會(huì)被垃圾收集器回收。
  • 軟引用用來描述一些還有用但非必須的對(duì)象。如果內(nèi)存空間足夠,垃圾回收器就不會(huì)回收它,如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存。軟引用可用來實(shí)現(xiàn)內(nèi)存敏感的高速緩存。軟引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用,如果軟引用所引用的對(duì)象被垃圾回收,JAVA虛擬機(jī)就會(huì)把這個(gè)軟引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。
    // PRime holds a strong referenceCounter counter = new Counter();// soft reference variable has SoftReference to Counter Object primeSoftReference soft = new SoftReference(counter) ; // now Counter object is eligible for garbage collection // but only be collected when JVM absolutely needs memoryprime = null; 
  • 弱引用也是用來描述一些非必須的對(duì)象,但是引用強(qiáng)度比軟引用還要弱,被弱引用關(guān)聯(lián)的對(duì)象只能存活到下一次垃圾收集之前。一個(gè)使用弱引用的例子是WeakHashMap,它是除HashMap和TreeMap之外,Map接口的另一種實(shí)現(xiàn)。WeakHashMap有一個(gè)特點(diǎn):map中的鍵值(keys)都被封裝成弱引用,也就是說一旦強(qiáng)引用被刪除,WeakHashMap內(nèi)部的弱引用就無法阻止該對(duì)象被垃圾回收器回收。
    Counter counter = new Counter(); // weak referenceWeakReference weak = new WeakReference(counter);// now Counter object is eligible for garbage collectioncounter = null;
  • 虛引用的對(duì)象可以在任何時(shí)候被垃圾回收器回收。

4.生存還是死亡

  一個(gè)對(duì)象真正死亡,至少要經(jīng)歷兩次標(biāo)記過程。如果對(duì)象在可達(dá)性分析后發(fā)現(xiàn)沒有與GC Roots相連接的引用鏈,那它將會(huì)被第一次標(biāo)記并且進(jìn)行一次篩選,篩選條件是該對(duì)象是否有必要執(zhí)行finalize()方法。當(dāng)對(duì)象沒有覆蓋finalize()方法或者finalize()方法已經(jīng)被虛擬機(jī)執(zhí)行過,則認(rèn)為沒有必要執(zhí)行。如果對(duì)象有必要執(zhí)行finalize()方法,那么該對(duì)象會(huì)被放置到一個(gè)叫F-Queue的隊(duì)列中,并稍后由一個(gè)JVM自動(dòng)建立的、低優(yōu)先級(jí)的Finalizer線程去執(zhí)行。這里的“執(zhí)行”指虛擬機(jī)有機(jī)會(huì)促發(fā)這個(gè)方法,但不承諾會(huì)等待其運(yùn)行結(jié)束。finalize()方法是對(duì)象逃脫死亡的最后一次機(jī)會(huì),稍后GC將對(duì)F-Queue中的對(duì)象進(jìn)行第二次標(biāo)記,如果對(duì)象在finalize()中將自己重新與引用鏈上的任意對(duì)象建立關(guān)聯(lián)(例如將自己this賦值給某個(gè)類變量或?qū)ο蟮某蓡T變量),那么第二次標(biāo)記是將其移出需要回收的集合,否則該對(duì)象就真的會(huì)被回收了。

5.回收方法區(qū)


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 榆树市| 佛坪县| 桂林市| 巢湖市| 调兵山市| 来安县| 西贡区| 六安市| 柘荣县| 什邡市| 微博| 高碑店市| 虹口区| 镇赉县| 新泰市| 博野县| 青河县| 商南县| 永州市| 佳木斯市| 康保县| 鄂托克前旗| 南雄市| 科技| 英山县| 姚安县| 涿州市| 呼伦贝尔市| 万宁市| 双柏县| 宣汉县| 贵港市| 珠海市| 阳高县| 甘德县| 遂平县| 绩溪县| 云龙县| 德格县| 封丘县| 东源县|