JVM--对象的分配原则(内存分配策略)

对象优先分配到Eden Space区

新创建的对象被分配到Eden Space区,Eden Space区内存不足就会触发MinorGC清理Eden Space内存。这个区域(新生代)的对象都是朝生夕死,是对象最频繁发生的区域。

 

大对象直接进入老年代

需要大量连续空间的对象,如:长字符串、大数组等,会直接在老年代分配内存。这是因为,这样可以避免在新生代区频繁的GC时发生大量的内存赋值(新生代的GC是采用复制算法的)。

 

长期存活对象进入老年代

在Eden Space 与 两个Survivor区域的对象,每移动一次,对象的年龄会加1,当到达伐值时(默认15),对象就会从年轻代移动到老年代。

 

动态年龄判定

虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,指一个Survivor区,一共两个,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄

 

空间分配担保

如果Eden区域不够容纳对象,则向老年代借内存,就是空间担保。

新生代使用复制算法完成垃圾收集,为了节约内存Survivor的设置的比较小,当Minor GC后如果还有大量对象存活,超过了一个Survivor的内存空间,这时就需要老年代进行分配担保,把Survivor中无法容纳的对象直接进入老年代。若虚拟机检查老年代中最大可用连续空间大于新生代所有对象总空间那么就能保证不需要发生Full GC,因为老年代的内存空间够用。反之,如果老年代中最大可用连续空间小于新生代所有对象总空间就需要在尝试Minor GC失败后进行Full GC或者直接Full GC。
 

你可能感兴趣的:(JVM,模块,对象分配原则)