對象優先在新生代的 eden 區分配內存,但是也並不絕對,下面幾種情況對象會晉升到老年代
- 大對象直接進入老年代。比如很長的字符串,或者很大的數組等。
- 長期存活的對象進入老年代。在堆中分配內存的對象,其內存布局的對象頭中(Header)包含了 GC 分代年齡標記信息。如果對象在 eden 區出生,那么它的 GC 分代年齡會初始值為 1,每熬過一次 Minor GC 而不被回收,這個值就會增加 1 歲。當它的年齡到達一定的數值時(jdk1.7 默認是 15 歲),就會晉升到老年代中。
- 動態對象年齡判定。當 Survivor 空間中相同年齡所有對象的大小總和大於 Survivor 空間的一半,年齡大於或等於該年齡的對象就可以直接進入老年代,而不需要達到默認的分代年齡。