国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《深入理解Java虛擬機(jī)》讀書筆記:判斷對(duì)象是否存活

這篇具有很好參考價(jià)值的文章主要介紹了《深入理解Java虛擬機(jī)》讀書筆記:判斷對(duì)象是否存活。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本節(jié)內(nèi)容的概要如下;

《深入理解Java虛擬機(jī)》讀書筆記:判斷對(duì)象是否存活

                                        對(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ì)象就是不可能再被使用的。

客觀地說(shuō),引用計(jì)數(shù)算法(Reference Counting)的實(shí)現(xiàn)簡(jiǎn)單,判定效率也很高,在大部分情況下它都是一個(gè)不錯(cuò)的算法,但是,至少主流的Java虛擬機(jī)里面沒(méi)有選用引用計(jì)數(shù)算法來(lái)管理內(nèi)存,其中最主要的原因是它很難解決對(duì)象之間相互循環(huán)引用的問(wèn)題。

?

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

這個(gè)算法的基本思路就是通過(guò)一系列的稱為“GC Roots”的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)開(kāi)始向下搜索,搜索所走過(guò)的路徑稱為引用鏈(Reference Chain),當(dāng)一個(gè)對(duì)象到GC Roots沒(méi)有任何引用鏈相連(用圖論的話來(lái)說(shuō),就是從GC Roots到這個(gè)對(duì)象不可達(dá))時(shí),則證明此對(duì)象是不可用的。

如圖3-1所示,對(duì)象object 5、object 6、object 7雖然互相有關(guān)聯(lián),但是它們到GC Roots是不可達(dá)的,所以它們將會(huì)被判定為是可回收的對(duì)象。

?

《深入理解Java虛擬機(jī)》讀書筆記:判斷對(duì)象是否存活

        圖3-1 可達(dá)性分析算法判定對(duì)象是否可回收

?

在Java語(yǔ)言中,可作為GC Roots的對(duì)象包括下面幾種:

  1. 虛擬機(jī)棧(棧幀中的本地變量表)中引用的對(duì)象。
  2. 方法區(qū)中類靜態(tài)屬性引用的對(duì)象。
  3. 方法區(qū)中常量引用的對(duì)象。
  4. 本地方法棧中JNI(即一般說(shuō)的Native方法)引用的對(duì)象。

?

二、引用類型

在JDK 1.2之后,Java對(duì)引用的概念進(jìn)行了擴(kuò)充,將引用分為強(qiáng)引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)4種,這4種引用強(qiáng)度依次逐漸減弱。

1、強(qiáng)引用

強(qiáng)引用就是指在程序代碼之中普遍存在的,類似“Object obj = new Object()”這類的引用,只要強(qiáng)引用還存在,垃圾收集器永遠(yuǎn)不會(huì)回收掉被引用的對(duì)象。

2、軟引用

軟引用是用來(lái)描述一些還有用但并非必需的對(duì)象。對(duì)于軟引用關(guān)聯(lián)著的對(duì)象,在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前,將會(huì)把這些對(duì)象列進(jìn)回收范圍之中進(jìn)行第二次回收。如果這次回收還沒(méi)有足夠的內(nèi)存,才會(huì)拋出內(nèi)存溢出異常。在JDK 1.2之后,提供了SoftReference類來(lái)實(shí)現(xiàn)軟引用。

3、弱引用

弱引用也是用來(lái)描述非必需對(duì)象的,但是它的強(qiáng)度比軟引用更弱一些,被弱引用關(guān)聯(lián)的對(duì)象只能生存到下一次垃圾收集發(fā)生之前。當(dāng)垃圾收集器工作時(shí),無(wú)論當(dāng)前內(nèi)存是否足夠,都會(huì)回收掉只被弱引用關(guān)聯(lián)的對(duì)象。在JDK 1.2之后,提供了WeakReference類來(lái)實(shí)現(xiàn)弱引用。

4、虛引用

虛引用也稱為幽靈引用或者幻影引用,它是最弱的一種引用關(guān)系。一個(gè)對(duì)象是否有虛引用的存在,完全不會(huì)對(duì)其生存時(shí)間構(gòu)成影響,也無(wú)法通過(guò)虛引用來(lái)取得一個(gè)對(duì)象實(shí)例。為一個(gè)對(duì)象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是能在這個(gè)對(duì)象被收集器回收時(shí)收到一個(gè)系統(tǒng)通知。在JDK 1.2之后,提供了PhantomReference類來(lái)實(shí)現(xiàn)虛引用。

?

三、 生存還是死亡

即使在可達(dá)性分析算法中不可達(dá)的對(duì)象,也并非是“非死不可”的,這時(shí)候它們暫時(shí)處于“緩刑”階段,要真正宣告一個(gè)對(duì)象死亡,至少要經(jīng)歷兩次標(biāo)記過(guò)程:如果對(duì)象在進(jìn)行可達(dá)性分析后發(fā)現(xiàn)沒(méi)有與GC Roots相連接的引用鏈,那它將會(huì)被第一次標(biāo)記并且進(jìn)行一次篩選,篩選的條件是此對(duì)象是否有必要執(zhí)行finalize()方法。當(dāng)對(duì)象沒(méi)有覆蓋finalize()方法,或者finalize()方法已經(jīng)被虛擬機(jī)調(diào)用過(guò),虛擬機(jī)將這兩種情況都視為“沒(méi)有必要執(zhí)行”。

如果這個(gè)對(duì)象被判定為有必要執(zhí)行finalize()方法,那么這個(gè)對(duì)象將會(huì)放置在一個(gè)叫做F-Queue的隊(duì)列之中,并在稍后由一個(gè)由虛擬機(jī)自動(dòng)建立的、低優(yōu)先級(jí)的Finalizer線程去執(zhí)行它。這里所謂的“執(zhí)行”是指虛擬機(jī)會(huì)觸發(fā)這個(gè)方法,但并不承諾會(huì)等待它運(yùn)行結(jié)束,這樣做的原因是,如果一個(gè)對(duì)象在finalize()方法中執(zhí)行緩慢,或者發(fā)生了死循環(huán)(更極端的情況),將很可能會(huì)導(dǎo)致F-Queue隊(duì)列中其他對(duì)象永久處于等待,甚至導(dǎo)致整個(gè)內(nèi)存回收系統(tǒng)崩潰。finalize()方法是對(duì)象逃脫死亡命運(yùn)的最后一次機(jī)會(huì),稍后GC將對(duì)F-Queue中的對(duì)象進(jìn)行第二次小規(guī)模的標(biāo)記,如果對(duì)象要在finalize()中成功拯救自己——只要重新與引用鏈上的任何一個(gè)對(duì)象建立關(guān)聯(lián)即可,譬如把自己(this關(guān)鍵字)賦值給某個(gè)類變量或者對(duì)象的成員變量,那在第二次標(biāo)記時(shí)它將被移除出“即將回收”的集合;如果對(duì)象這時(shí)候還沒(méi)有逃脫,那基本上它就真的被回收了。

?

四、回收方法區(qū)

方法區(qū)(或者HotSpot虛擬機(jī)中的永久代),進(jìn)行垃圾收集的“性價(jià)比”一般比較低。

永久代的垃圾收集主要回收兩部分內(nèi)容:廢棄常量無(wú)用的類。

如何判定廢棄常量:沒(méi)有任何對(duì)象引用

如何判定一個(gè)類是否是“無(wú)用的類”,類需要同時(shí)滿足下面3個(gè)條件才能算是“無(wú)用的類”:

  1. 該類所有的實(shí)例都已經(jīng)被回收,也就是Java堆中不存在該類的任何實(shí)例。
  2. 加載該類的ClassLoader已經(jīng)被回收。
  3. 該類對(duì)應(yīng)的java.lang.Class 對(duì)象沒(méi)有在任何地方被引用,無(wú)法在任何地方通過(guò)反射訪問(wèn)該類的方法。

在大量使用反射、動(dòng)態(tài)代理、CGLib等ByteCode框架、動(dòng)態(tài)生成JSP以及OSGi這類頻繁自定義ClassLoader的場(chǎng)景都需要虛擬機(jī)具備類卸載的功能,以保證永久代不會(huì)溢出。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-624667.html

?

到了這里,關(guān)于《深入理解Java虛擬機(jī)》讀書筆記:判斷對(duì)象是否存活的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 《深入理解Java虛擬機(jī)》讀書筆記: 類加載器

    《深入理解Java虛擬機(jī)》讀書筆記: 類加載器

    ????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?類加載器 ? ??虛擬機(jī)設(shè)計(jì)團(tuán)隊(duì)把類加載階段中的“通過(guò)一個(gè)類的全限定名來(lái)獲取描述此類的二進(jìn)制字節(jié)流”這個(gè)動(dòng)作放到Java虛擬機(jī)外部去實(shí)現(xiàn),以便讓應(yīng)用程序自己決定如何去獲取所需要的類。實(shí)現(xiàn)

    2024年02月11日
    瀏覽(18)
  • 《深入理解Java虛擬機(jī)》讀書筆記:內(nèi)存分配策略

    《深入理解Java虛擬機(jī)》讀書筆記:內(nèi)存分配策略

    Java技術(shù)體系中所提倡的自動(dòng)內(nèi)存管理最終可以歸結(jié)為自動(dòng)化地解決了兩個(gè)問(wèn)題:給對(duì)象分配內(nèi)存以及回收分配給對(duì)象的內(nèi)存。關(guān)于回收內(nèi)存這一點(diǎn),我們已經(jīng)使用了大量篇幅去介紹虛擬機(jī)中的垃圾收集器體系以及運(yùn)作原理,現(xiàn)在我們?cè)僖黄饋?lái)探討一下給對(duì)象分配內(nèi)存的那點(diǎn)事

    2024年02月13日
    瀏覽(22)
  • 《深入理解Java虛擬機(jī)》讀書筆記:字節(jié)碼指令簡(jiǎn)介

    《深入理解Java虛擬機(jī)》讀書筆記:字節(jié)碼指令簡(jiǎn)介

    字節(jié)碼指令簡(jiǎn)介 ? Java虛擬機(jī)的指令由一個(gè)字節(jié)長(zhǎng)度的、代表著某種特定操作含義的數(shù)字(稱為操作碼,Opcode)以及跟隨其后的零至多個(gè)代表此操作所需參數(shù)(稱為操作數(shù),Operands)而構(gòu)成。由于Java虛擬機(jī)采用面向操作數(shù)棧而不是寄存器的架構(gòu)(這兩種架構(gòu)的區(qū)別和影響將在

    2024年02月12日
    瀏覽(20)
  • 《深入理解Java虛擬機(jī)》讀書筆記:垃圾收集器

    《深入理解Java虛擬機(jī)》讀書筆記:垃圾收集器

    垃圾收集器 ? HotSpot虛擬機(jī)包含的所有收集器如圖3-5所示。圖3-5展示了7種作用于不同分代的收集器,如果兩個(gè)收集器之間存在連線,就說(shuō)明它們可以搭配使用。 新生代收集器:Serial、ParNew、Parallel Scavenge,新生代收集器均采用復(fù)制算法 老年代收集器:Serial Old(標(biāo)記-整理算法

    2024年02月13日
    瀏覽(23)
  • 《深入理解Java虛擬機(jī)》讀書筆記:內(nèi)存分配與回收策略

    《深入理解Java虛擬機(jī)》讀書筆記:內(nèi)存分配與回收策略

    Java技術(shù)體系中所提倡的自動(dòng)內(nèi)存管理最終可以歸結(jié)為自動(dòng)化地解決了兩個(gè)問(wèn)題:給對(duì)象分配內(nèi)存以及回收分配給對(duì)象的內(nèi)存。關(guān)于回收內(nèi)存這一點(diǎn),我們已經(jīng)使用了大量篇幅去介紹虛擬機(jī)中的垃圾收集器體系以及運(yùn)作原理,現(xiàn)在我們?cè)僖黄饋?lái)探討一下給對(duì)象分配內(nèi)存的那點(diǎn)事

    2024年02月13日
    瀏覽(27)
  • 《深入理解Java虛擬機(jī)》讀書筆記:HotSpot的算法實(shí)現(xiàn)

    《深入理解Java虛擬機(jī)》讀書筆記:HotSpot的算法實(shí)現(xiàn)

    HotSpot的算法實(shí)現(xiàn)概要 由于目前的主流Java虛擬機(jī)使用的都是準(zhǔn)確式GC(這個(gè)概念在第1章介紹Exact VM對(duì)Classic VM的改進(jìn)時(shí)講過(guò)),所以當(dāng)執(zhí)行系統(tǒng)停頓下來(lái)后,并不需要一個(gè)不漏地檢查完所有執(zhí)行上下文和全局的引用位置,虛擬機(jī)應(yīng)當(dāng)是有辦法直接得知哪些地方存放著對(duì)象引用。

    2024年02月13日
    瀏覽(17)
  • 《深入理解Java虛擬機(jī)》讀書筆記:Class類文件的結(jié)構(gòu)

    《深入理解Java虛擬機(jī)》讀書筆記:Class類文件的結(jié)構(gòu)

    Class類文件的結(jié)構(gòu) ? Sun公司以及其他虛擬機(jī)提供商發(fā)布了許多可以運(yùn)行在各種不同平臺(tái)上的虛擬機(jī),這些虛擬機(jī)都可以載入和執(zhí)行同一種平臺(tái)無(wú)關(guān)的的程序存儲(chǔ)格式——字節(jié)碼(ByteCode),從而實(shí)現(xiàn)了程序的“一次編寫,到處運(yùn)行”。 ? Java虛擬機(jī)提供的語(yǔ)言無(wú)關(guān)性 ? “Clas

    2024年02月13日
    瀏覽(18)
  • 《深入理解Java虛擬機(jī)》讀書筆記: 虛擬機(jī)類加載的時(shí)機(jī)和過(guò)程

    《深入理解Java虛擬機(jī)》讀書筆記: 虛擬機(jī)類加載的時(shí)機(jī)和過(guò)程

    虛擬機(jī)類加載的時(shí)機(jī)和過(guò)程 類從被加載到虛擬機(jī)內(nèi)存中開(kāi)始,到卸載出內(nèi)存為止,它的整個(gè)生命周期包括:加載(Loading)、驗(yàn)證(Verification)、準(zhǔn)備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)7個(gè)階段。其中驗(yàn)證、準(zhǔn)備、解析3個(gè)

    2024年02月12日
    瀏覽(25)
  • 《深入理解Java虛擬機(jī)》讀書筆記:基于棧的字節(jié)碼解釋執(zhí)行引擎

    《深入理解Java虛擬機(jī)》讀書筆記:基于棧的字節(jié)碼解釋執(zhí)行引擎

    ??虛擬機(jī)是如何調(diào)用方法的內(nèi)容已經(jīng)講解完畢,從本節(jié)開(kāi)始,我們來(lái)探討虛擬機(jī)是如何執(zhí)行方法中的字節(jié)碼指令的。上文中提到過(guò),許多Java虛擬機(jī)的執(zhí)行引擎在執(zhí)行Java代碼的時(shí)候都有 解釋執(zhí)行(通過(guò)解釋器執(zhí)行) 和 編譯執(zhí)行(通過(guò)即時(shí)編譯器產(chǎn)生本地代碼執(zhí)行) 兩種選

    2024年02月11日
    瀏覽(51)
  • 《深入理解Java虛擬機(jī)(第三版)》讀書筆記:Java內(nèi)存區(qū)域與內(nèi)存溢出異常、垃圾收集器與內(nèi)存分配策略

    《深入理解Java虛擬機(jī)(第三版)》讀書筆記:Java內(nèi)存區(qū)域與內(nèi)存溢出異常、垃圾收集器與內(nèi)存分配策略

    下文是閱讀《深入理解Java虛擬機(jī)(第3版)》這本書的讀書筆記,如有侵權(quán),請(qǐng)聯(lián)系刪除。 Java虛擬機(jī)在執(zhí)行Java程序的過(guò)程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域。這些區(qū)域有各自的用途,以及創(chuàng)建和銷毀的時(shí)間,有的區(qū)域隨著虛擬機(jī)進(jìn)程的啟動(dòng)而一直存在,有

    2024年02月03日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包