一、GC垃圾回收算法
1、标记清除法(Mark-Sweep)
这是一种最基础的垃圾回收算法,分为两个步骤,标记阶段和清除阶段,在内存中标记需要回收的对象,在清除阶段清除带有标记的对象所占的内存空间。
图片:
注:这种算法最大的问题就是内存碎片化严重,后续可能发生比较大的对象没法找到可用的内存区域。
2、复制算法(copying)
这种算法是为了解决 Mark-Sweep 内存碎片化严重而提出来的,它将内存容量划分为等量大小的两块内存区域。只使用其中的一块区域,当这块内存区域使用完后,将这块内存区域里面存活的对象复制到另一块内存里去,并删除已使用的内存区域。
优缺点:这种算法虽然实现简单,效率较高,不容易产生内存碎片,但是内存压缩,只能使用到原来内存的一半,当存活的对象较多是,则效率对大大的下降。
3、标记整理法(Mark-compact)
此清理算法综合了前面两种,在标记阶段和 Mark-Sweep一样,标记后不是清理对象,而是将存活的对象移动到内存的一端,然后清除边际外的内存空间。
4、分代收集法
1、分代收集法是目前大部分JVM所采用的方法,其核心原理是根据对象的不同的生命周期,将内存区域划分为新生代和老年代。
老年代的特点是只有少部分的对象需要进行回收,新生代的特点是每次都有大量的对象需要回收,所以根据根据不同的内存区域使用不同的GC算法。
2、新生代因为每次需要回收大量的对象,即需要复制的对象较少,所以采用copying算法; 老年代每次回收的对象较少,所以采用Mark-Conpact算法。
3、新生代内存区域划分: Eden区 和 Survivor区( From Space区、To Space)
4、内存使用:每次使用内存空间的时候只使用 Eden区和Survivor区里面的From区, 当进行GC回收时,则将此空间存活的对象copying到To space空间去,然后清理Eden和From Space区间。当To Space无法储存某个对象时,则这个对象会被放入到老年代中。
5、在Survivor区域内躲过一个GC回收,则此对象的年岁+1, 当达到默认的年岁15的时候,则该对象将移入老年代中。