JVM分代收集算法图解
-
在第一次进行Minor GC时,对于Eden区新创建的对象大部分是垃圾对象,对于少数活跃的对象会被复制到Survival To区中,并且让其寿命加1,内存图如下图所示。
-
紧接着会把To区的对象都会被通过复制算法,复制到From区。此时Eden区和Survival To区的都是空闲的,内存图如下所示:
-
程序继续运行,经过第一次GC,Eden又可以保存新建对象了,随着程序的运行,此时Eden区的内存又满了。需要进行第二次GC操作,同第一次一样,暂时活跃的对象,需要复制到Survival To区,同时当熬过这一次GC时,对象的年龄加1,进行保存。和第一次GC不同的是,此时Survival From区中也有幸存的对象,这时,需要根据Survival From区的对象年龄大小来确定该区中对象的去向,看其年龄是否达到设定的指定阈值。如果达到指定阈值,会被分配到Old Generation,如果没有则会被复制到Survival To区,当熬过这一次GC时,From区的年龄也会加1,具体内存分配图如下所示:
-
紧接着会把Survival To区的对象,复制到Survival From中去。这时候Eden和Survival区中的内存就空余出来了,供后续新创建的对象来存储,经过第二次GC后的内存分配图:
-
GC会一直重复这样的过程,有的对象会进入到老年区,有的则会游离在To和From之间,游离在两者之间的对象可能会达到阈值,到达老年代中。当“To”区被填满,这时“To”区被填满之后,会将所有对象移动到年老代中,当老年代空间被用完,就要进行 Full GC了。
-
如果新生代老年代中的内存都满了,就会先触发Minor Gc,再触发Full GC,扫描新生代和老年代中所有不再使用的对象并回收
Full GC当老年代内存不足,即老年代的垃圾回收。