Java 創(chuàng)建的對象到底放在哪?
大家好,我是二哥呀。創(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

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