常见的垃圾回收算法和垃圾收集器

从如何判断消亡的角度出发,垃圾收集算法可分为:“ 引用计数式垃圾收集 ” 和 “ 追踪式垃圾收集 ” 。也被称为: “直接垃圾收集 ” 和 “ 间接垃圾收集 ” 。

一、分代收集理论

大多数商业虚拟机都遵循分代收集的理论,它建立在两个假说之上:

  1. 弱分代假说:绝大多数对象都是朝生夕灭的。
  2. 强分代假说:熬过越多次垃圾收集过程的对象越难被回收。
  3. 跨代引用假说:跨代引用相对于同代来说仅占极少数。

前两条假说共同奠定了多款常用的垃圾收集器的统一设计原则:垃圾收集器应该将 Java 堆划分出不同的区域,然后将回收对象依据其年龄分配到不同的区域中存储。

二、常见的垃圾回收算法
1. 标记 - 清除算法

标记 - 清除算法分为标记和清除两个阶段:首先标记出所有需要清除的对象,在标记完成之后,统一回收所有被标记的对象。也可以反过来,标记存活的对象,回收没有被标记的对象。

缺点:执行效率不高,内存空间容易碎片化。

2. 标记 - 复制算法

它将可用的内存空间划分为两个大小相等的两块,每次只是一块,当一块用完之后就将还存活的对象放到另一块内存区域,并清除已经使用过的这一块的内存区域。

缺点:造成了严重的内存空间浪费

3. 标记 - 整理算法

首先标记出所有需要清除的对象,标记完成之后,让所有存活的对象都向内存空间的另一边移动,然后直接清除掉边界以外的内存区域

缺点:空间碎片化问题

三、常见的垃圾收集器
1 . Serial 收集器

这是一款针对于新生代,基于单线程,采用标记 - 复制算法来实现的最基础,最历史悠久的收集器,在它进行垃圾收集时,必须暂停其他所有工作线程,直到它结束收集。比较适合运行在客户端模式下的虚拟机。

2 . ParNew 收集器

这是一款针对于新生代,基于多线程,采用标记 - 复制算法来实现的收集器,实质上是 Serial 收集器的多线程并行版本,适合运行在服务端模式下的虚拟机。

3 . Parallel Scavenge 收集器

这是 一款针对于新生代,基于多线程,采用标记 - 复制算法来实现的一款吞吐量优先的收集器,它提供了两个参数用于精准控制吞吐量:-XX:MaxGCPauseMillis 参数用于控制最大垃圾收集停顿时间,-XX:GCTimeRatio
参数用于直接设置吞吐量大小。

4 . Serial Old 收集器

这是一款针对于老年代,基于单线程,采用标记 - 整理算法来实现的一款 Serial 收集器的老年代版本,适合运行与客户端模式下的虚拟机。

5 . Parallel Old 收集器

这是一款针对于老年代,基于多线程,采用标记 - 整理算法来实现的一款吞吐量优先的收集器。

6 . CMS 收集器

这是一款针对于老年代,基于多线程,采用标记 - 清除算法来实现的收集器,主要优点为:并发收集,低停顿。缺点为:对处理器资源非常敏感,无法处理浮动垃圾,容易造成空间碎片。它的运作过程主要分为四个步骤:

  1. 初始标记
  2. 并发标记
  3. 重新标记
  4. 并发清除
7 . Garbage First(G1)收集器

这是一款基于多线程,采用标记 - 清除算法来实现得一款主要面向服务器端的应用的垃圾收集器,它可以面向堆内存的任何部分来组成回收集来进行垃圾回收,衡量标准不再是它属于那个分代,而是那个内存块存放的垃圾最多,回收效益最大。它的运作过程分为四个部分:

  1. 初始标记
  2. 并发标记
  3. 最终标记
  4. 筛选回收
四、低延迟垃圾收集器
1 . Shenandoah 收集器

它是第一款不是由 Oracle 公司开发的 HotSpot 垃圾收集器,基于 Region 的堆内存布局,同样有着用于存放大对象的 Humongous Region ,并且不设分代收集,默认的回收策略也同样是优先处理回收价值最大的 Region。
工作过程大致分为九个阶段:

  1. 初始标记
  2. 并发标记
  3. 最终标记
  4. 并发清理
  5. 并发回收
  6. 初始引用更新
  7. 并发引用更新
  8. 最终引用更新
  9. 并发清理
2 . ZGC 收集器

它是一款基于 Region 内存布局的,(暂时)不设分代的,使用了读屏障染色指针内存多重映射等技术来实现可并发的标记 - 整理算法的,以低延迟为首要目标的一款垃圾收集器 。
它的运作过程大致分为几个阶段:

  1. 并发标记
  2. 并发预备重分配
  3. 并发重分配
  4. 并发重映射
五、无操作垃圾收集器
1. Epsilon 收集器

一个垃圾收集器除了垃圾收集这个本职工作之外,它还要负责堆的管理与布局,对象的分配,与解释器的协作,与监控子系统的协作,为了隔离垃圾收集器与 Java 虚拟机解释,编译,监控子系统的关系,RedHat 提出了统一的接口,即 JEP 304 提案,Epsilon 是这个接口的有效性验证和参考实现,同时也是用于需要剥离垃圾收集器影响性能测试和压力测试。优点:负载极小,没有任何回收行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值