為對象分配內(nèi)存是一件非常嚴(yán)謹(jǐn)和復(fù)雜的任務(wù),JVM 的設(shè)計者們不僅需要考慮內(nèi)存如何分配、在哪里分配等問題,并且由于內(nèi)存分配算法和內(nèi)存回收算法密切相關(guān),所以還需要考慮 GC 執(zhí)行完內(nèi)存回收后是否會在內(nèi)存空間中產(chǎn)生內(nèi)存碎片。
1、new 的對象先放在伊甸園區(qū),此區(qū)有大小限制;
2、當(dāng)伊甸園的空間填滿時,程序又需要創(chuàng)建對象,JVM 的垃圾回收器將對伊甸園區(qū)進(jìn)行垃圾回收(Minor GC),將伊甸園區(qū)中的不再被其他對象所引用的對象進(jìn)行銷毀。再加載新的對象放到伊甸園區(qū);
3、然后將伊甸園中的剩余對象移動到幸存者 0 區(qū);
4、如果再次觸發(fā)垃圾回收,此時上次幸存下來的放到幸存者 0 區(qū),如果沒有回收,就會放到幸存者 1 區(qū);
5、如果再次經(jīng)歷垃圾回收,此時會重新放回幸存者 0 區(qū),接著再去幸存者 1 區(qū);
6、什么時候才會去養(yǎng)老區(qū)呢? 默認(rèn)是 15 次回收標(biāo)記;
7、在養(yǎng)老區(qū),相對悠閑。當(dāng)養(yǎng)老區(qū)內(nèi)存不足時,再次觸發(fā) Major GC,進(jìn)行養(yǎng)老區(qū)的內(nèi)存清理;
8、若養(yǎng)老區(qū)執(zhí)行了 Major GC 之后發(fā)現(xiàn)依然無法進(jìn)行對象的保存,就會產(chǎn)生 OOM 異常。