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

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

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

由于垃圾收集算法的實(shí)現(xiàn)涉及大量的程序細(xì)節(jié),而且各個(gè)平臺(tái)的虛擬機(jī)操作內(nèi)存的方法又各不相同,因此本節(jié)不打算過(guò)多地討論算法的實(shí)現(xiàn),只是介紹幾種算法的思想及其發(fā)展過(guò)程。

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

                垃圾收集算法概要

?

1、 標(biāo)記-清除算法

  標(biāo)記-清除算法最基礎(chǔ)的收集算法是“標(biāo)記-清除”(Mark-Sweep)算法,算法分為“標(biāo)記”和“清除”兩個(gè)階段:首先標(biāo)記出所有需要回收的對(duì)象,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對(duì)象,它的標(biāo)記過(guò)程其實(shí)在前一節(jié)講述對(duì)象標(biāo)記判定時(shí)已經(jīng)介紹過(guò)了。之所以說(shuō)它是最基礎(chǔ)的收集算法,是因?yàn)楹罄m(xù)的收集算法都是基于這種思路并對(duì)其不足進(jìn)行改進(jìn)而得到的。它的主要不足有兩個(gè):一個(gè)是效率問(wèn)題,標(biāo)記和清除兩個(gè)過(guò)程的效率都不高;另一個(gè)是空間問(wèn)題,標(biāo)記清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多可能會(huì)導(dǎo)致以后在程序運(yùn)行過(guò)程中需要分配較大對(duì)象時(shí),無(wú)法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動(dòng)作。標(biāo)記—清除算法的執(zhí)行過(guò)程如圖3-2所示。

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

                  圖3-2“標(biāo)記-清除”算法示意圖

?

2、復(fù)制算法

  為了解決效率問(wèn)題,一種稱(chēng)為“復(fù)制”(Copying)的收集算法出現(xiàn)了,它將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當(dāng)這一塊的內(nèi)存用完了,就將還存活著的對(duì)象復(fù)制到另外一塊上面,然后再把已使用過(guò)的內(nèi)存空間一次清理掉。這樣使得每次都是對(duì)整個(gè)半?yún)^(qū)進(jìn)行內(nèi)存回收,內(nèi)存分配時(shí)也就不用考慮內(nèi)存碎片等復(fù)雜情況,只要移動(dòng)堆頂指針,按順序分配內(nèi)存即可,實(shí)現(xiàn)簡(jiǎn)單,運(yùn)行高效。只是這種算法的代價(jià)是將內(nèi)存縮小為了原來(lái)的一半,未免太高了一點(diǎn)。復(fù)制算法的執(zhí)行過(guò)程如圖3-3所示。

現(xiàn)在的商業(yè)虛擬機(jī)都采用這種收集算法來(lái)回收新生代,IBM公司的專(zhuān)門(mén)研究表明,新生代中的對(duì)象98%是“朝生夕死”的,所以并不需要按照1∶1的比例來(lái)劃分內(nèi)存空間,而是將內(nèi)存分為一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和其中一塊Survivor[插圖]。當(dāng)回收時(shí),將Eden和Survivor中還存活著的對(duì)象一次性地復(fù)制到另外一塊Survivor空間上,最后清理掉Eden和剛才用過(guò)的Survivor空間。HotSpot虛擬機(jī)默認(rèn)Eden和Survivor的大小比例是8∶1,也就是每次新生代中可用內(nèi)存空間為整個(gè)新生代容量的90%(80%+10%),只有10%的內(nèi)存會(huì)被“浪費(fèi)”。

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

                            圖3-3 復(fù)制算法示意圖

?

3、標(biāo)記-整理算法

  “標(biāo)記-整理”(Mark-Compact)算法,標(biāo)記過(guò)程仍然與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對(duì)可回收對(duì)象進(jìn)行清理,而是讓所有存活的對(duì)象都向一端移動(dòng),然后直接清理掉端邊界以外的內(nèi)存,“標(biāo)記-整理”算法的示意圖如圖3-4所示。

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

                            圖3-4“標(biāo)記-整理”算法示意圖

?

4、分代收集算法

  當(dāng)前商業(yè)虛擬機(jī)的垃圾收集都采用“分代收集”(Generational Collection)算法,根據(jù)對(duì)象存活周期的不同將內(nèi)存劃分為幾塊。一般是把Java堆分為新生代和老年代,這樣就可以根據(jù)各個(gè)年代的特點(diǎn)采用最適當(dāng)?shù)氖占惴?。在新生代中,每次垃圾收集時(shí)都發(fā)現(xiàn)有大批對(duì)象死去,只有少量存活,那就選用復(fù)制算法,只需要付出少量存活對(duì)象的復(fù)制成本就可以完成收集。而老年代中因?yàn)閷?duì)象存活率高、沒(méi)有額外空間對(duì)它進(jìn)行分配擔(dān)保,就必須使用“標(biāo)記—清理”或者“標(biāo)記—整理”算法來(lái)進(jìn)行回收。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-638533.html

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

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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ī)》讀書(shū)筆記:Java內(nèi)存區(qū)域

    《深入理解Java虛擬機(jī)》讀書(shū)筆記:Java內(nèi)存區(qū)域

    Java內(nèi)存區(qū)域包含程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧、Java堆、方法區(qū)五個(gè)區(qū)域。 運(yùn)行時(shí)數(shù)據(jù)區(qū)分類(lèi) ? Java內(nèi)存區(qū)域 ? 程序計(jì)數(shù)器(Program Counter Register)是一塊較小的內(nèi)存空間,它可以看作是當(dāng)前線(xiàn)程所執(zhí)行的字節(jié)碼的信號(hào)指示器。 字節(jié)碼解釋器工作時(shí)就是通過(guò)改變這個(gè)計(jì)數(shù)

    2024年02月14日
    瀏覽(29)
  • 《深入理解Java虛擬機(jī)》讀書(shū)筆記: 類(lèi)加載器

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

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

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

    《深入理解Java虛擬機(jī)》讀書(shū)筆記:內(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ī)》讀書(shū)筆記:HotSpot虛擬機(jī)對(duì)象探秘

    《深入理解Java虛擬機(jī)》讀書(shū)筆記:HotSpot虛擬機(jī)對(duì)象探秘

    基于實(shí)用優(yōu)先的原則,以常用的虛擬機(jī)HotSpot和常用的內(nèi)存區(qū)域Java堆為例,深入探討HotSpot虛擬機(jī)在Java堆中對(duì)象分配、布局和訪問(wèn)的全過(guò)程。以下是本節(jié)內(nèi)容的腦圖。 ? HotSpot虛擬機(jī)對(duì)象探秘腦圖 ? 創(chuàng)建對(duì)象大致分為5步:1.檢查類(lèi)是否加載,沒(méi)有加載先加載類(lèi) 2.分配內(nèi)存 3.初始

    2024年02月14日
    瀏覽(19)
  • 《深入理解Java虛擬機(jī)》讀書(shū)筆記:判斷對(duì)象是否存活

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

    本節(jié)內(nèi)容的概要如下; 對(duì)象已死嗎? ? 給對(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)單,判定效率也很高,在

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

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

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

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

    《深入理解Java虛擬機(jī)》讀書(shū)筆記:內(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ī)》讀書(shū)筆記:Class類(lèi)文件的結(jié)構(gòu)

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

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

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

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

    虛擬機(jī)類(lèi)加載的時(shí)機(jī)和過(guò)程 類(lèi)從被加載到虛擬機(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ī)》讀書(shū)筆記:基于棧的字節(jié)碼解釋執(zhí)行引擎

    《深入理解Java虛擬機(jī)》讀書(shū)筆記:基于棧的字節(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)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包