内存分配
- 对象优先在Eden分配:若Eden区没有足够空间进行分配,Java虚拟机将发起一次Minor GC。
- 大对象直接进入老年代:大对象是指需要大量连续内存空间的Java对象,最典型的大对象就是字符串以及数组。
- 长期存活的对象将进入老年代:每个对象有一个对象年龄计数器,age+1的两个情况:
对象在Eden出生并经过第一次Minor GC后仍存活且能被Survivor容纳,age+1;
对象在Survivor区中每经过一次Minor GC,age+1。 - 动态对象年龄判定:如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到年龄阈值。
- 空间分配担保:
(1) 在Minor GC之前,JVM先检查老年代最大可用连续空间是否大于新生代所有空间总和,成立则此次GC安全。
(2) 不成立,查看是否允许担保失败(HandlerPromotionFailure)设置为true,不允许则进行Full GC。
(3) 允许,继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于则尝试一次Minor GC。
(4) 不大于,则进行Full GC。
- Minor GC:指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕死的特性,所以Minor GC非常频繁,一般回收速度也比较快。
- Major GC:指发生在老年代的GC,出现了Minor GC,经常会伴随至少一次的Minor GC。Major GC的速度一般会比Minor GC慢10倍以上。
- Full GC:对整个堆来说的,出现Full GC通常伴随至少一次Minor GC,但非绝对。
Full GC被触发的时候:老年代内存不足;持久代内存不足;统计得到的Minor GC晋升到老年代平均大小大于老年代空间。