首先堆中分为新生区(Young Generation Space)和老年区(Tenure generation space),新生区又分为伊甸区(Eden Space)和幸存者区(Survivor Space),幸存者区又分为幸存者from区和幸存者to区
当一个对象被new出来的时候首先被分配到伊甸区,如果伊甸区内存满了就会触发一次Minor GC,进行一次垃圾回收,然后把还存活的对象移动到幸存者to区,并将这个对象的年龄设置为1,再把幸存者from区中存活的对象移动到幸存者to区,将这些对象的年龄加1(一旦对象的年龄超过15,那么这个对象就会被转移到老年区),然后将from区中的对象清除,将to区和from区互换(to区变成from区,from区变成to区),然后如果老年区也满了,就会触发一个 Full GC,来清理整个堆中的空间。(大对象new的时候直接被分配到老年区)
Minor GC的触发条件:
- new对象的时候伊甸区空间不足
Full GC的触发条件:
- 老年区空间不足
- 方法区空间不足
- 调用System.gc()的时候会建议JVM执行Full GC但是不一定执行