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