JVM空间分配&GC机制
GC执行流程图
1. MinorGC触发的时机
1.1 老年代最大可用连续空间大于新生代所有对象的总和
因为有老年代在给新生代GC做兜底,哪怕新生代中的对象全部存活,只要老年代中最大可用连续空间大于新生代中所有对象的总和,老年代都可以放的下,所以此时新生代可以放心的GC,即进行MinorGc,又称YoungGc.
1.2 老年代最大可用连续空间大于新生代历次晋升到老年代的平均大小
当老年代最大可用连续空间小于新生代所有对象的总和且老年代最大可用连续空间大于新生代历次晋升到老年代的平均大小时,虽有可能发生极端事件:新生代所有的对象都存活,但毕竟是极小概率事件。有大于新生代历次晋升到老年代的平均大小条件的保证大概率事件上老年代是可以放的下的,真的放不下了就会发生FullGc了.
2. 触发FullGc时机
2.1 老年代最大可用连续空间小于新生代历次晋升到老年代的平均大小
2.2 老年代最大可用连续空间大于新生代历次晋升到老年代的平均大小但是MinorGC后存活的对象大于老年代最大可用连续空间
3. JVM内存分配
3.1 大多数情况下,对象优先分配到Eden区
3.2 大对象直接进入老年代
3.3 存活时间久的对象进入老年代
3.4 动态对象年龄判断机制
3.5 MinorGc后存活的对象Servivor区放不下也直接进入老年代
<待续>