一开始对象的创建都发生在新生代,随着对象的不断创建,如果新生代没有空间创建新对象,将会发生 GC ,这时的 GC 称之为 Minor GC,位于新生代的对象每经过一次 Minor GC 后,如果这个对象没有被回收,则为自己的标记数加1,这个标记数用于标识这个对象经历了多少次的 Minor GC,对于 Sun 的 Hotspot 虚拟机,如果这个次数超过 15 ,该对象才会被移动到老年代。
随着时间的推移,如果老年代也没有足够的空间容纳对象,老年代也会试着发起 GC,这时的 GC 被称为 Full GC。
相比 Minor GC,Full GC 发生的次数比较少,但是每发生一次 Full GC,整个堆内存区域都需要执行一次垃圾回收,这对程序性能造成的影响比 Minor GC 大很多。所以我们应该尽量避免或者减少 Full GC 的发生。
同时,在堆内存区域,发生最多的 GC 情形就是新生代的 Minor GC 了,因为所有的对象会优先去新生代开辟空间,所以这块的内存变化会很快,只有内存不够用,就会发生 GC,但是一般的 Minor GC 执行比 Full GC 快很多。为什么呢?因为新生代和老年代的垃圾回收算法不一样。
为了更好的管理堆内存,该区域分为新生代和老年代。
新生代发生垃圾回收要比老年代频繁。
新生代发生的垃圾回收成为 Minor GC;老年代发生的 GC 成为 Full GC。
新生代使用复制算法进行垃圾回收;老年代使用标记-整理算法
为了更高效管理新生代的内存,按照复制算法,结合 IBM 的研究论证,新生代分为三块,一块比较大的 Eden 区和两块比较小的 Survivor 区,比例为 8:1:1
参考