JVM在进行GC时,并不是新生代、老年代一起进行,大部分都是在新生代中回收,GC又分为Minor GC和Major GC。
Minor GC 和 Major GC 区别
Minor GC:
只针对新生代区域,指的是发生在新生代中的垃圾收集,由于大多数对象存活率不高,所有Minor GC非常频繁,回收速度快。
Major GC: 指的是发生在老年代的垃圾收集,出现Major GC时,经常会伴随至少一次的Minor GC。Major GC扫描空间较大,速度较慢。
GC四大算法
1.引用计数法(一般不使用):
使用该方法进行GC时,每个对象中会携带一个引用计数器,每当对象被引用就+1,结束引用就-1。直到对象的引用计数器为0,说明该对象没有被使用,回收对象。
缺点:每次对象赋值时需要维护引用计数器;较难处理循环引用。
2.复制算法(From、To):
复制算法在年轻代中使用,基本思想是将内存分成两块,每次只用其中一块,当一块内存用完,将活着的对象复制到另一个块上。
优点:速度快,不会产生内存碎片。
缺点:消耗内存空间。
3.标记清除:
标记清除发生在老年代,分成标记和清楚两个阶段,先标记出需要回收的对象,然后统一进行回收。
优点:不需要额外空间。
缺点:两次扫描,耗时,会产生内存碎片。
4.标记压缩:
标记压缩发生在老年代,一般是由标记清楚与标记整理混合实现。首先与标记清除相同, 回收后再次扫描,整理存活对象。
优点:不会产生内存碎片。
缺点:需要移动存活对象,消耗成本,耗时。
没有最好的垃圾回收算法,只有最合适的,在不同代中使用不同垃圾回收算法,也称分代收集算法。
内存效率:复制算法>标记清除算法>标记整理算法
内存整齐度:复制算法=标记整理算法>标记清除算法
内存利用率:标记整理算法=标记清除算法>复制算法