GC垃圾收集的算法

常见的垃圾回收算法有:引用计数法、标记清除法、标记压缩法、复制算法、分代算法等。
1.引用计数法
原理:
假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败 时,对象A的引用计数器就-1,如果对象A的计数器的值为0,就说明对象A没有引用了, 可以被回收。
优点:

  • 实时性较高,无需等到内存不够的时候,才开始回收,运行时根据对象的计数器是否 为0,就可以直接回收。

  • 在垃圾回收过程中,应用无需挂起。如果申请内存时,内存不足,则立刻报outofmember错误。

  • 区域性,更新对象的计数器时,只是影响到该对象,不会扫描全部对象。
    缺点:

  • 每次对象被引用时,都需要去更新计数器,有一点时间开销。

  • 浪费CPU资源,即使内存够用,仍然在运行时进行计数器的统计。

  • 无法解决循环引用问题。(最大的缺点)即在两个都为null的对象相互引用时,无法回收。
    2.标记清除法
    标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除。

  • 标记:从根节点开始标记引用的对象。

  • 清除:未被标记引用的对象就是垃圾对象,可以被清理。
    原理:
    当有效内存空间耗尽了,JVM将会停止应用程序的运行并开启GC线程,然后开始进行标记工作,按照根搜索算法,标记完以后, 对象的状态如下图

  • GC垃圾收集的算法
    所有从root对象可以到达的对象就被标记为存活的对象,然后执行第二阶段清除,将未被标记的对象回收清除掉,并且将标记位重新归0。然后唤醒停止的程序线程,让程序继续运行。
    优点:
    标记清除算法解决了引用计数算法中的循环引用的问题,没有从root节点引用的对象都会被回收。
    缺点:

  • 效率较低,标记和清除两个动作都需要遍历所有的对象,并且在GC时,需要停止应 用程序,对于交互性要求比较高的应用而言这个体验是非常差的。

  • 通过标记清除算法清理出来的内存,碎片化较为严重,因为被回收的对象可能存在于 内存的各个角落,所以清理出来的内存是不连贯的。
    3.标记压缩算法
    标记压缩算法是在标记清除算法的基础之上,做了优化改进的算法。和标记清除算法一 样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的清理未标 记的对象,而是将存活的对象压缩到内存的一端,然后清理边界以外的垃圾,从而解决 了碎片化的问题。
    原理:
    GC垃圾收集的算法
    GC垃圾收集的算法
    优缺点:
    优缺点同标记清除算法,解决了标记清除算法的碎片化的问题,同时,标记压缩算法多 了一步,对象移动内存位置的步骤,其效率也有有一定的影响。
    4.复制算法
    复制算法的核心就是,将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收 时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内 存的角色,完成垃圾的回收。 如果内存中的垃圾对象较多,需要复制的对象就较少,这种情况下适合使用该方式并且 效率比较高,反之,则不适合。
    原理:
    GC垃圾收集的算法
    JVM中年轻代内存空间
    1.在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor 区“To”是空的。
    2.紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍 存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过- XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对 象会被复制到“To”区域。
    3.经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他 们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前 的“To”。不管怎样,都会保证名为To的Survivor区域是空的。
    4.GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象 移动到年老代中。
    优点:

  • 在垃圾对象多的情况下,效率较高

  • 清理后,内存无碎片
    缺点:

  • 在垃圾对象少的情况下,不适用,如:老年代内存

  • 分配的2块内存空间,在同一个时刻,只能使用一半,内存使用率较低
    5. 分代算法
    前面介绍了多种回收算法,每一种算法都有自己的优点也有缺点,谁都不能替代谁,所 以根据垃圾回收对象的特点进行选择,才是明智的选择。
    分代算法其实就是这样的,根据回收对象的特点进行选择,在jvm中,年轻代适合使用复 制算法,老年代适合使用标记清除或标记压缩算法。