JVM垃圾回收常见算法


一. 引用计数法

  1. 原理
    假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败时,对象A的引用计数器就-1,如果对象A的计数器的值为0,就说明对象A没有引用了,可以被回收
  2. 优点
    实现简单,而且效率较高
  3. 缺点
    无法解决循环引用的问题

二. 标记清除法

  1. 原理
    标记清除算法是将垃圾回收分为2个阶段,分别是标记和清除
    标记:从根节点开始标识引用的对象
    清除:未被标识引用的对象就是垃圾对象,可以被清理

  2. 优点
    标记清除算法解决了引用计数算法中的循环引用的问题,没有从root节点引用的对象都会被回收

  3. 缺点
    效率较低,标记和清除两个动作都需要遍历所有的对象,并且在GC时,需要停止应用程序,交互性体验是非常差的
    通过标识清除算法清理出来的内存,碎片化比较严重,因为被回收的对象可能存在于内存的各个角落,所以清理出来的内存是不连贯的

三. 标记压缩法

  1. 原理
    在标记清除算法的基础上,在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存
  2. 优点
    解决了标记清除的碎片化问题和提高内存利用率
  3. 缺点
    增加了cpu使用

四. 复制算法

  1. 原理
    它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。
  2. 优点
  • 在垃圾对象多的情况下,效率较高
  • 清理后,内存无碎片
  1. 缺点
  • 在垃圾对象少的情况下,不适用, 如:老年代内存
  • 分配的2块内存空间,在同一个时刻,只能使用一半,内存使用率较低

四. 分代算法

  1. 原理
    根据回收对象的特点进行选择,在jvm中,年轻代适合使用复制算法,老年代适合使用标记清除或标记压缩算法