<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 創(chuàng)建的對象到底放在哪?

          共 1812字,需瀏覽 4分鐘

           ·

          2022-02-26 17:17

          大家好,我是二哥呀。創(chuàng)建對象的時(shí)候,對象是在堆內(nèi)存中創(chuàng)建的。但堆內(nèi)存又分為新生代和老年代,新生代又細(xì)分為 Eden 空間、From Survivor 空間、To Survivor 空間。那我們創(chuàng)建的對象到底在哪里

          一、對象優(yōu)先在 Eden 分配

          堆內(nèi)存分為新生代和老年代,新生代是用于存放使用后準(zhǔn)備被回收的對象,老年代是用于存放生命周期比較長的對象。

          大部分我們創(chuàng)建的對象,都屬于生命周期比較短的,所以會(huì)存放在新生代。新生代又細(xì)分 Eden 空間、From Survivor 空間、To Survivor 空間,我們創(chuàng)建的對象優(yōu)先在 Eden 分配。

          隨著對象的創(chuàng)建,Eden 剩余內(nèi)存空間越來越少,就會(huì)觸發(fā) Minor GC,于是 Eden 的存活對象會(huì)放入 From Survivor 空間。

          Minor GC 后,新對象依然會(huì)往 Eden 分配。

          Eden 剩余內(nèi)存空間越來越少,又會(huì)觸發(fā) Minor GC,于是 Eden 和 From Survivor 的存活對象會(huì)放入 To Survivor 空間。

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

          在上面的流程中,如果一個(gè)對象很大,一直在 Survivor 空間復(fù)制來復(fù)制去,那很費(fèi)性能,所以這些大對象直接進(jìn)入老年代。

          可以用 XX:PretenureSizeThreshold 來設(shè)置這些大對象的閾值。

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

          在上面的流程中,如果一個(gè)對象 Hello_A,已經(jīng)經(jīng)歷了 15 次 Minor GC 還存活在 Survivor 空間中,那他即將轉(zhuǎn)移到老年代。這個(gè) 15 可以通過 -XX:MaxTenuringThreshold 來設(shè)置的,默認(rèn)是 15。

          虛擬機(jī)為了給對象計(jì)算他到底經(jīng)歷了幾次 Minor GC,會(huì)給每個(gè)對象定義了一個(gè)對象年齡計(jì)數(shù)器。如果對象在 Eden 中經(jīng)過第一次 Minor GC 后仍然存活,移動(dòng)到 Survivor 空間年齡加 1,在 Survivor 區(qū)中每經(jīng)歷過 Minor GC 后仍然存活年齡再加 1。年齡到了 15,就到了老年代。

          四、動(dòng)態(tài)年齡判斷

          除了年齡達(dá)到 MaxTenuringThreshold 的值,還有另外一個(gè)方式進(jìn)入老年代,那就是動(dòng)態(tài)年齡判斷:在 Survivor 空間中相同年齡所有對象大小的總和大于 Survivor 空間的一半,年齡大于或等于該年齡的對象就可以直接進(jìn)入老年代。

          比如 Survivor 是 100M,Hello1 和 Hello2 都是 3 歲,且總和超過了 50M,Hello3 是 4 歲,這個(gè)時(shí)候,這三個(gè)對象都將到老年代。

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

          上面的流程提過,存活的對象都會(huì)放入另外一個(gè) Survivor 空間,如果這些存活的對象比 Survivor 空間還大呢?整個(gè)流程如下:

          • Minor GC 之前,虛擬機(jī)會(huì)先檢查老年代最大可用的連續(xù)空間是否大于新生代所有對象總空間,如果大于,則發(fā)起 Minor GC。
          • 如果小于,則看 HandlePromotionFailure 有沒有設(shè)置,如果沒有設(shè)置,就發(fā)起 full gc。
          • 如果設(shè)置了 HandlePromotionFailure,則看老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小,如果小于,就發(fā)起 full gc。
          • 如果大于,發(fā)起 Minor GC。Minor GC 后,看 Survivor 空間是否足夠存放存活對象,如果不夠,就放入老年代,如果夠放,就直接存放 Survivor 空間。如果老年代都不夠放存活對象,擔(dān)保失敗(Handle Promotion Failure),發(fā)起 full gc。

          好了,今天就分享到這兒吧,我是二哥呀,我們下期見~~


          原文鏈接:juejin.cn/post/7052894117105238053

          沒有什么使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不系之舟

          推薦閱讀

          瀏覽 115
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人免费大屌 | 激情五月久久 | 蘑菇视频 成人精品战指 | 97爽无码人妻AⅤ精品牛牛 | 蝌蚪自拍网站 |