堆由年轻代和老年代组成,年轻代由Eden,From,To区组成,如下图:
步骤1
新建的对象一般是放在Eden区,但是Eden区经过一定的时间后会被放满,此时会触发minor gc,这此GC会把Eden区和Survivor区中的没有引用的对象进行垃圾回收,然后身剩下的有引用的对象会向From区移动。
步骤2
然后继续产生新的对象放入Eden中,当Eden中又被放满后,会同时对Eden和Survivor中的From区域同时进行minor gc,将Eden和From区的的无引用的对象清空,将Eden和From中还存活觉得对象全部移动到To区
步骤3
然后继续产生新的对象放入Eden中,当Eden中又被放满后,会同时对Eden和Survivor中的To区域同时进行minor gc,将Eden和To区的的无引用的对象清空,将Eden和To中还存活觉得对象全部移动到From区。
然后重复步骤2和3
步骤4
对象每经历一次minir gc对象的头中分代年龄会+1,当到达默认值15后最后会被移动到老年代。比如静态变量,线程池,spring容器中的bean都会一直存活被移动到老年代。
步骤5
当老年代也满了后,就会触发一次full gc,触发stop world.将程序中断,对整个堆甚至方法区进行垃圾回收,耗时时间比较长,所以尽量不要频繁的触发full gc