对象分配
- 优先在Eden区分配。当Eden区没有足够空间分配时, VM发起一次Minor GC, 将 Eden区和其中一块Survivor区内尚存活的对象放入另一块Survivor区域。如Minor GC时survivor空间不够,对象提前进入老年代,老年代空间不够时进行Full GC;
- 大对象直接进入老年代,避免在Eden区和Survivor区之间产生大量的内存复制, 此 外大对象容易导致还有不少空闲内存就提前触发GC以获取足够的连续空间.
对象晋级
- 年龄阈值:VM为每个对象定义了一个对象年龄(Age)计数器, 经第一次Minor GC后 仍然存活, 被移动到Survivor空间中, 并将年龄设为1. 以后对象在Survivor区中每熬 过一次Minor GC年龄就+1. 当增加到一定程度(-XX:MaxTenuringThreshold, 默认 15), 将会晋升到老年代.
- 提前晋升: 动态年龄判定;如果在Survivor空间中相同年龄所有对象大小的总和大 于Survivor空间的一半, 年龄大于或等于该年龄的对象就可以直接进入老年代, 而无 须等到晋升年龄.
从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC, 对老年代GC称为Major GC,而Full GC是对整个堆来说;
Minor GC触发条件:当Eden区满时,触发Minor GC。
Full GC触发条件:
- System.gc()
- 老年代空间不足
- 永生区空间不足
- 统计得到的MinorGC晋升到旧生代的平均大小大于老年代 的剩余空间
- 堆中分配很大的对象