<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    GC,Reference,Finalize,Dispose

    Posted on 2008-11-18 14:50 英雄 閱讀(653) 評(píng)論(0)  編輯  收藏
     

    GC,Reference,Finalize,Dispose

    Java提供了垃圾對(duì)象自動(dòng)回收(GC)機(jī)制,該機(jī)制對(duì)堆heap里的對(duì)象就其被引用情況進(jìn)行跟蹤判斷,對(duì)合適對(duì)象進(jìn)行自動(dòng)回收釋放內(nèi)存。按java規(guī)范,對(duì)象分如下引用情況:

    • An object is strongly reachable if it can be reached by some thread without traversing any reference objects. A newly-created object is strongly reachable by the thread that created it.
    • An object is softly reachable if it is not strongly reachable but can be reached by traversing a soft reference.
    • An object is weakly reachable if it is neither strongly nor softly reachable but can be reached by traversing a weak reference. When the weak references to a weakly-reachable object are cleared, the object becomes eligible for finalization.
    • An object is phantom reachable if it is neither strongly, softly, nor weakly reachable, it has been finalized, and some phantom reference refers to it.
    • Finally, an object is unreachable, and therefore eligible for reclamation, when it is not reachable in any of the above ways.

    根據(jù)引用情況不同,GC處理過(guò)程也不同。

    當(dāng)一個(gè)對(duì)象實(shí)例不被強(qiáng)引用strongly reachable時(shí),GC的某次運(yùn)行就有可能掃描到該對(duì)象。這時(shí)GC會(huì)檢查該對(duì)象是否softreference reachable,如果是,則盡可能放它一馬,一笑而過(guò),但如果放過(guò)去就會(huì)引起out of memory error,則就要處理該對(duì)象。處理過(guò)程首先要檢查是否實(shí)現(xiàn)了finalize方法的對(duì)象,如果是則標(biāo)記finalizable,并導(dǎo)致Finalizer系統(tǒng)線程(setDaemon(true)Thread.MAX_PRIORITY - 2)在后續(xù)巡檢中對(duì)此對(duì)象調(diào)用finalize方法。執(zhí)行完finalize方法后如果在此后某次的GC運(yùn)行中再次被發(fā)現(xiàn)softreference reachable,則此時(shí)導(dǎo)致clear softreference,并釋放內(nèi)存,最后歸到softreference-queue中。

    如果本對(duì)象沒(méi)有實(shí)現(xiàn)finalize方法,則GC省去其對(duì)應(yīng)處理環(huán)節(jié)。

    此過(guò)程同樣適用于weakreference reachable,所不同的是GC將不會(huì)盡可能放過(guò)該對(duì)象。

    對(duì)于PhantomReference reachable,情況不同之處在于PhantomReference reachable定義在finalize已經(jīng)執(zhí)行結(jié)束后的GC的某次運(yùn)行時(shí),這個(gè)時(shí)候,它不去PhantomReference clear,也不釋放內(nèi)存,而是直接歸到PhantomReference-queue中,此后需要應(yīng)用程序自行clear才能釋放,這也是PhantomReference一定要求queue的原因。

    基于此GC機(jī)制,對(duì)“實(shí)現(xiàn)當(dāng)不使用某對(duì)象時(shí)釋放其附屬資源”這樣的需求,java提供兩種實(shí)現(xiàn)方式。

    Finalize方式就是指Object class的那個(gè)Finalize方法,可以被任何class進(jìn)行override來(lái)實(shí)現(xiàn)釋放對(duì)應(yīng)附屬資源。由于歷史原因,執(zhí)行該finalize方法的Finalizer線程保留為一個(gè)低優(yōu)先級(jí)線程,因此導(dǎo)致獲得巡檢機(jī)會(huì)從而進(jìn)行資源釋放將不是十分及時(shí);另外,java規(guī)范允許在finalize方法中再次使該對(duì)象恢復(fù)強(qiáng)引用,因而GC總是在執(zhí)行finalize后的再次運(yùn)行中才考慮釋放該對(duì)象的內(nèi)存,如果該對(duì)象本身占用內(nèi)存比較大,這樣同樣導(dǎo)致整體資源釋放將不是十分及時(shí)。最后,如果一個(gè)class實(shí)現(xiàn)了finalize方法,不僅如上所述釋放其實(shí)例時(shí)比較占用機(jī)器資源,建立實(shí)例的過(guò)程也將因要通過(guò)必須的finalize方法檢測(cè)及底層register而占用額外的資源。為此,java提供了Dispose模式可以用來(lái)替代finalize模式。

    Dispose方式的實(shí)現(xiàn)就不在class里實(shí)現(xiàn)finalize方法了。在jre中,已經(jīng)為java2D的支持實(shí)現(xiàn)了一個(gè)Disposer用來(lái)幫助釋放對(duì)象附用的圖形資源,下面以此為例說(shuō)明Dispose方式。

    sun.java2d.Dispose隨著類加載初始化構(gòu)建一個(gè)Java2D Disposer線程(setDaemon(true)Thread.MAX_PRIORITY),同時(shí)該類對(duì)外提供public static addRecord(Object target, DisposerRecord rec)用來(lái)建立對(duì)指定targetweakreference PhantomReference(系統(tǒng)屬sun.java2d.reftype指定)監(jiān)測(cè)。當(dāng)指定對(duì)象target失去強(qiáng)引用而成為weakreferencePhantomReference reachable時(shí),會(huì)被GC及時(shí)置入reference-queue中,同時(shí)被高優(yōu)先級(jí)的本Java2D Disposer線程及時(shí)監(jiān)測(cè)到,然后本線程會(huì)去從reference-queue中拿到此reference,并通過(guò)內(nèi)部映射表hashtable找到當(dāng)初addRecord時(shí)傳入的DisposerRecord,并調(diào)用其dispose()。所以在該dispose方法中實(shí)現(xiàn)釋放附屬資源的邏輯就可以了。


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 日本中文字幕免费看| 亚洲中文字幕无码爆乳app| 免费又黄又爽又猛大片午夜| 日韩免费电影在线观看| 日本亚洲欧美色视频在线播放| 亚洲人成网站在线观看播放动漫| 国产精品免费AV片在线观看| 在线免费视频一区二区| 无码亚洲成a人在线观看| 国产成人在线免费观看| 午夜在线免费视频| 国产亚洲av片在线观看16女人| 精品四虎免费观看国产高清午夜| 亚洲va无码专区国产乱码| 在线美女免费观看网站h| 亚洲国产精品网站久久| 免费毛片在线播放| 曰批全过程免费视频观看免费软件| 精品国产香蕉伊思人在线在线亚洲一区二区 | 亚洲色欲色欲www在线播放| 青青青青青青久久久免费观看| 国产AV日韩A∨亚洲AV电影| 国产精品V亚洲精品V日韩精品| 成人毛片100免费观看| 亚洲黄网在线观看| 免费的一级片网站| 中文字幕免费在线观看动作大片 | 亚洲日韩中文无码久久| 最近2019免费中文字幕6| 国产亚洲中文日本不卡二区| 亚洲精品一级无码中文字幕| 国内精品一级毛片免费看| 亚洲中文字幕久久精品无码A| 亚洲精品亚洲人成在线观看下载| 最近最新高清免费中文字幕| 亚洲s码欧洲m码吹潮| 精品国产免费观看| 亚洲成a人片在线观| 免费a级黄色毛片| 在线观看免费中文视频| v片免费在线观看|