JVM之内存分配与回收策略

基本规则:对象主要分配在新生代的Eden区,如果启动了本地线程分配缓冲,则先在TLAB上分配,少数情况下也可能直接进入老年代。

分配的规则不是100%确定的,其细节取决于当前使用的是哪一种垃圾收集器组合。


大对象直接进入老年区,虚拟机设置超过多少大小的对象直接进入老年去,避免在新生代发生过多复制操作。


长期存活的对象进入老年代:经历了一次minor GC 后,存活的对象从eden区进入survivor区,默认情况下,当对象年龄为15时(即经过了15次minor GC),对象将进入老年代。


动态对象年龄判定:进入老年代的年龄可以动态变化。前提条件是,当survivor区某个年龄的对象大小总和大于该空间一半时,超过该年龄的对象全部进入老年区。


Minor GC 还是 Full GC:

JVM之内存分配与回收策略


何为冒险:一般来说,新生代只使用一个survivor空间来进行轮换时的备份,所以当出现极端情况(即新生代空间在一次minor GC后全部存活)时survivor空间有可能爆满,所以此时需要老年代进行分配担保,即survivor区无法容纳的对象都进入老年代。


在JDK 6 Updale 24 之后,Handle PromotionFailure 不会再影响到虚拟机的空间分配担保策略,只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC,否则将进行Full GC