乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      JVM的內(nèi)存分配策略

       看風(fēng)景D人 2019-04-25

      一、內(nèi)存分配策略

          1.Java技術(shù)體系中所提倡的自動(dòng)內(nèi)存管理可以歸結(jié)于兩個(gè)部分:給對(duì)象分配內(nèi)存以及回收分配給對(duì)象的內(nèi)存。 
          2.我們都知道,Java對(duì)象分配,都是在Java堆上進(jìn)行分配的,雖然存在JIT編譯后被拆分為標(biāo)量類型并簡介地在棧上進(jìn)行分配。如果采用分代算法,那么新生的對(duì)象是分配在新生代的Eden區(qū)上的。如果啟動(dòng)了本地線程分配緩沖,將按線程優(yōu)先在TLAB上進(jìn)行分配。 
          3.事實(shí)上,Java的分配規(guī)則不是百分百固定的,其取決于當(dāng)前使用的是哪一種垃圾收集器組合,還有虛擬機(jī)中與內(nèi)存相關(guān)的參數(shù)的設(shè)置。 
          4.下面我們以上節(jié)我們講過的Serial和Serial Old收集器做一個(gè)內(nèi)存分配和回收的策略總結(jié)。

      二、對(duì)象優(yōu)先在新生代Eden分配

      新生代的內(nèi)存分配情況: 

      內(nèi)存分配情況: 
          將JVM內(nèi)存劃分為一塊較大的Eden空間(80%)和兩塊小的Servivor(各占10%)。當(dāng)回收時(shí),將Eden和Survivor中還存活的對(duì)象一次性采用復(fù)制算法直接復(fù)制到另外一塊Servivor空間上,最后清理掉原Eden空間和原先的Survivor空間中的數(shù)據(jù)。 
         大多數(shù)情況下,對(duì)象在新生代Eden區(qū)中分配。當(dāng)Eden區(qū)沒有足夠空間進(jìn)行分配時(shí),JVM將發(fā)起一次Minor GC。 
      在這里先說明兩個(gè)概念:

      • 新生代GC(Minor GC):指發(fā)生在新生代的垃圾收集動(dòng)作,因?yàn)镴ava對(duì)象大多是具有朝生夕滅的特性,所以Minor GC非常頻繁,而且該速度也比較快。

      • 老年代GC(Major GC/Full GC):指發(fā)生在老年代的GC,出現(xiàn)了Major GC,一般可能也會(huì)伴隨著一次Minor GC,但是與Minor GC不同的是,Major GC的速度慢十倍以上。

      三、大對(duì)象直接進(jìn)入老年代

      1.我們先對(duì)所謂的大對(duì)象做一個(gè)定義:大對(duì)象,這里指的是需要大量連續(xù)內(nèi)存空間的Java對(duì)象。最典型的大對(duì)象可以是很長的字符串和數(shù)組。 
      2.JVM對(duì)大對(duì)象的態(tài)度: 大對(duì)象對(duì)于JVM的內(nèi)存分配來說是十分麻煩的,如果我們將大對(duì)象分配在新生代中,這樣子的話很容易導(dǎo)致內(nèi)存還有不少空間時(shí)就提前觸發(fā)垃圾回收以獲取足夠的連續(xù)空間來“安置”它們。
      3.為了避免上述情況的經(jīng)常發(fā)生而導(dǎo)致不需要的GC活動(dòng)所浪費(fèi)的資源和時(shí)間,可采用的分配策略是將大對(duì)象直接分配到老年代中去,虛擬機(jī)中也提供了-XX:PretenureSizeThreshold參數(shù),令大于這個(gè)設(shè)置值的對(duì)象直接在老年代里面分配內(nèi)容。

      四、長期存活的對(duì)象將進(jìn)入老年代

      1.當(dāng)JVM采用分代收集的思想來管理內(nèi)存時(shí),為了識(shí)別哪些對(duì)象應(yīng)該放在新生代、哪些對(duì)象應(yīng)該放在老年代,JVM給每個(gè)對(duì)象定義了一個(gè)對(duì)象年齡計(jì)數(shù)器。 
      2.對(duì)象年齡計(jì)數(shù)器:如果對(duì)象在Eden出生并經(jīng)過第一次Minor GC后仍然存活,并且能被Survivor容納的話,便可以被移動(dòng)到Survivor空間中,年齡計(jì)數(shù)器將設(shè)置該對(duì)象的年齡為1。對(duì)于對(duì)象在Survivor區(qū)每經(jīng)過一次Minor GC,年齡便增加1歲,當(dāng)它的年齡增加到一定程度,默認(rèn)為15(可通過參數(shù)-XX:MaxTenuringThreshold設(shè)置),該對(duì)象便會(huì)進(jìn)入到老年代中。成為老年代的對(duì)象。

      五、動(dòng)態(tài)對(duì)象年齡判定

      事實(shí)上,有的虛擬機(jī)并不永遠(yuǎn)地要求對(duì)象的年齡必須達(dá)到MaxTeruringThreshold才能晉升老年代,如果在Survivor空間中相同年齡所有對(duì)象大小的總和大于Surivior空間的一半,年齡大于或等于該年齡的對(duì)象就可以直接進(jìn)行老年代,無須等到MaxTeruringThreshold中所要求的年齡。

      六、空間分配擔(dān)保

      在發(fā)生Minor GC之前,虛擬機(jī)會(huì)先檢查老年代中最大的可用的連續(xù)空間是否大于新生代中所有對(duì)象總空間,如果這個(gè)條件成立,那么Minor GC可以確保是安全的,如果不成立,則虛擬機(jī)會(huì)查看HandlePromotionFaiure設(shè)置值是否允許擔(dān)保失敗。如果允許,那么會(huì)繼續(xù)檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對(duì)象的平均大小,如果大于,將嘗試進(jìn)行一次Minor GC,盡管這次GC是有風(fēng)險(xiǎn)的;如果小于,或者HandlePromotionFaiure設(shè)置不允許冒險(xiǎn),那么這時(shí)就要改為進(jìn)行一次Full GC。 
      所謂冒險(xiǎn):也就是說當(dāng)用來輪轉(zhuǎn)的Survivor區(qū)無法承受新生代中所存活的對(duì)象內(nèi)存時(shí),需要老年代進(jìn)行分配擔(dān)保,把Survivor無法容納的對(duì)象直接進(jìn)入老年代中,前提是老年代中

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多