五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Java虛擬機(jī)-垃圾收集算法

2020-10-05 13:27 作者:bili_93709487  | 我要投稿

分代收集理論

當(dāng)前商業(yè)虛假你寄的垃圾收集器,大多數(shù)遵循了“分代收集”的理論,它建立在兩個(gè)分代假說上:

  • 弱分代假說:絕大數(shù)對(duì)象都是朝生夕滅的。

  • 強(qiáng)分代假說:熬過越多次垃圾收集過程的對(duì)象就越難消亡。

這兩個(gè)分代假說共同奠定了多款常用垃圾收集器的一致的設(shè)計(jì)原則:收集器應(yīng)將Java堆劃分出不同區(qū)域,然后將回收對(duì)象依據(jù)其年齡(即熬過垃圾收集過程次數(shù))分配到不同區(qū)域中存儲(chǔ)。

在Java堆劃分出不同區(qū)域之后,垃圾收集器才能每次只回收其中某一個(gè)或者某些部分區(qū)域------因而才有了“Minor GC”、“Major GC”、“Full GC”這樣的回收類型劃分;也才能夠針對(duì)不同區(qū)域安排與里面存儲(chǔ)對(duì)象存亡特征相匹配的垃圾收集算法:“標(biāo)記-復(fù)制算法”、“標(biāo)記-清除算法”、“標(biāo)記-整理算法”。

把分代收集理論具體放到現(xiàn)在商用虛擬機(jī)里,設(shè)計(jì)者一般至少會(huì)把Java堆劃分為新生代老年代兩個(gè)區(qū)域。

跨分代假說

分代收集并非只是簡(jiǎn)單的劃分一下內(nèi)存區(qū)域那么容易,他至少存在著一個(gè)困難:對(duì)象不是孤立的,對(duì)象間會(huì)存在跨代引用(在新生代中“不可達(dá)”的對(duì)象,可能被老年代中的對(duì)象引用,反之亦然)。

  • 跨代引用假說:跨代引用相對(duì)于同代引用來說僅占少數(shù)。

這其實(shí)是可以根據(jù)前兩條假說推出的隱含推論:存在相互引用關(guān)系的兩個(gè)對(duì)象,是應(yīng)該傾向于同時(shí)消亡的。(由于老年代引用對(duì)象難以消亡,其引用的新生代對(duì)象也同樣難以消亡,進(jìn)而年齡增長(zhǎng),新對(duì)象會(huì)進(jìn)入老年代,這種跨代引用關(guān)系就消失了)。

依據(jù)這條假說,我們就不需要為了少量的跨代引用去掃描整個(gè)老年代,也不必專門記錄每個(gè)對(duì)象是否存在及存在哪些跨代引用。只需要建立一個(gè)全局的數(shù)據(jù)結(jié)構(gòu)(記憶集, Remembered Set),這個(gè)結(jié)構(gòu)把老年代劃分成若干小塊,標(biāo)識(shí)出拿一塊內(nèi)存會(huì)存在跨代引用。此后發(fā)生Minor GC時(shí),會(huì)將這些區(qū)域加入到GC Roots掃描。

部分收集(Partial GC):指不是完整收集整個(gè)Java堆的垃圾收集。

  • 新生代收集(Minor GC/Young GC):目標(biāo)只是新生代的垃圾收集。

  • 老年代收集(Major GC/Old GC):目標(biāo)只是老年代的垃圾收集。

    目前只有CMS收集器會(huì)有單獨(dú)收集老年代的行為。

  • 混合收集(Mixed GC):指收集整個(gè)新生代和部分老年代的垃圾收集。

    目前只有G1收集器會(huì)有這種行為。

整堆收集(Full GC):收集整個(gè)Java堆和方法區(qū)的垃圾收集。


垃圾收集算法

  • 標(biāo)記-清除算法(Mark-Sweep)

    算法分為標(biāo)記和清除兩個(gè)階段,在標(biāo)記完成后,統(tǒng)一回收掉所有被標(biāo)記(或未被標(biāo)記)的對(duì)象。標(biāo)記過程就是判定對(duì)象是否“死亡”的過程。

    它主要有兩個(gè)缺點(diǎn):執(zhí)行效率不穩(wěn)定、內(nèi)存空間碎片。


標(biāo)記-清除算法
  • 標(biāo)記-復(fù)制算法

    將內(nèi)存分為大小相等的兩塊,每次只使用其中的一塊,當(dāng)一塊內(nèi)存用完了,就將還存活帶著的對(duì)象復(fù)制到另外一塊上,再把已使用過的內(nèi)存空間一次性清理掉。

    這樣實(shí)現(xiàn)簡(jiǎn)單,運(yùn)行高效,但代價(jià)是將可用內(nèi)存縮小為原來的一半,空間浪費(fèi)太多。

    Andrew Appel針對(duì)具備“朝生夕滅”特點(diǎn)的對(duì)象(新生代中的對(duì)象有98%熬不過第一輪收集),提出了一種更優(yōu)化的半?yún)^(qū)復(fù)制分代策略,現(xiàn)在稱為“Appel式回收”。具體做法是:將新生代分為一塊較大的Eden和兩塊較小的Survivor空間(8:1:1),每次分配內(nèi)存只用Eden空間和其中一塊Survivor空間。發(fā)生垃圾收集時(shí),將Eden和Survivor中還存活的對(duì)象復(fù)制到另一塊Survivor中,然后清除掉Eden和已經(jīng)用過的那塊Survivor。Appel式回收還有針對(duì)極端情況(存活的對(duì)象超過了Survivor的內(nèi)存大小)的安全設(shè)計(jì),當(dāng)Survivor不能再存放更多對(duì)象時(shí)就需要其他區(qū)域進(jìn)行分配擔(dān)保(實(shí)際上大多為老年代)。


標(biāo)記-復(fù)制算法
  • 標(biāo)記-整理算法(Mark-Compact)

    “標(biāo)記-復(fù)制算法”在對(duì)象存活率較高時(shí)就需要進(jìn)行更多的復(fù)制操作,效率會(huì)將會(huì)降低。針對(duì)老年代的存亡特征,提出了另一種針對(duì)性的算法---“標(biāo)記-整理算法”。標(biāo)記-整理算法也分為標(biāo)記和整理兩個(gè)步驟,標(biāo)記過程和“標(biāo)記-清除算法”一樣,但后續(xù)步驟不不是直接對(duì)可回收對(duì)象進(jìn)行清理,而是讓所有存活的對(duì)象都向一邊移動(dòng),然后直接清理掉邊界以外的內(nèi)存。

    “標(biāo)記-清除算法”與“標(biāo)記-整理算法”的本質(zhì)差異在于前者是一種非移動(dòng)式的回收算法,而后者是移動(dòng)式的。

    是否移動(dòng)存活的對(duì)象是一項(xiàng)優(yōu)缺點(diǎn)并存的風(fēng)險(xiǎn)決策:如果移動(dòng)對(duì)象,尤其是老年代這種有大量對(duì)象存活的區(qū)域,移動(dòng)這些存活對(duì)象會(huì)是一種負(fù)重極大的操作,并且移動(dòng)對(duì)象的操作必須全程暫停用戶應(yīng)用程序才能進(jìn)行(最新的ZGC和Shenandoah收集器使用讀屏障技術(shù)實(shí)現(xiàn)了整理過程與用戶線程并發(fā)執(zhí)行);如不移動(dòng)對(duì)象,就會(huì)導(dǎo)致內(nèi)存空間碎片化的問題,只能依賴于更加復(fù)雜的內(nèi)存分配器和內(nèi)存訪問器來解決。

    基于以上兩點(diǎn),是否一定對(duì)象都存在弊端。有一種“和稀泥式”的解決方案可以不在內(nèi)存分配和訪問上增加太多額外負(fù)擔(dān),做法是讓虛擬機(jī)平時(shí)多數(shù)采用“標(biāo)記-清除算法”,容忍內(nèi)存碎片的存在,知道內(nèi)存空間碎片化程度已經(jīng)影響到對(duì)象分配時(shí),再采用“標(biāo)記-整理算法”一次,以獲得規(guī)整的空間。CMS收集器就是采用的這種辦法。


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


Java虛擬機(jī)-垃圾收集算法的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
阳朔县| 政和县| 富阳市| 彰化市| 阜平县| 襄垣县| 固安县| 浑源县| 固原市| 高陵县| 许昌市| 昌乐县| 修武县| 林口县| 循化| 鲁甸县| 冕宁县| 阜平县| 宜阳县| 建平县| 岳普湖县| 德江县| 曲阜市| 平潭县| 正蓝旗| 汉阴县| 安乡县| 永和县| 犍为县| 肥西县| 大英县| 泰兴市| 洛扎县| 中方县| 深泽县| 玉山县| 萨迦县| 岐山县| 普兰县| 吉林省| 西林县|