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