常见的垃圾回收算法和垃圾收集器
从如何判断消亡的角度出发,垃圾收集算法可分为:“ 引用计数式垃圾收集 ” 和 “ 追踪式垃圾收集 ” 。也被称为: “直接垃圾收集 ” 和 “ 间接垃圾收集 ” 。
一、分代收集理论
大多数商业虚拟机都遵循分代收集的理论,它建立在两个假说之上:
- 弱分代假说:绝大多数对象都是朝生夕灭的。
- 强分代假说:熬过越多次垃圾收集过程的对象越难被回收。
- 跨代引用假说:跨代引用相对于同代来说仅占极少数。
前两条假说共同奠定了多款常用的垃圾收集器的统一设计原则:垃圾收集器应该将 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 收集器
这是一款针对于老年代,基于多线程,采用标记 - 清除算法来实现的收集器,主要优点为:并发收集,低停顿。缺点为:对处理器资源非常敏感,无法处理浮动垃圾,容易造成空间碎片。它的运作过程主要分为四个步骤:
- 初始标记
- 并发标记
- 重新标记
- 并发清除
7 . Garbage First(G1)收集器
这是一款基于多线程,采用标记 - 清除算法来实现得一款主要面向服务器端的应用的垃圾收集器,它可以面向堆内存的任何部分来组成回收集来进行垃圾回收,衡量标准不再是它属于那个分代,而是那个内存块存放的垃圾最多,回收效益最大。它的运作过程分为四个部分:
- 初始标记
- 并发标记
- 最终标记
- 筛选回收
四、低延迟垃圾收集器
1 . Shenandoah 收集器
它是第一款不是由 Oracle 公司开发的 HotSpot 垃圾收集器,基于 Region 的堆内存布局,同样有着用于存放大对象的 Humongous Region ,并且不设分代收集,默认的回收策略也同样是优先处理回收价值最大的 Region。
工作过程大致分为九个阶段:
- 初始标记
- 并发标记
- 最终标记
- 并发清理
- 并发回收
- 初始引用更新
- 并发引用更新
- 最终引用更新
- 并发清理
2 . ZGC 收集器
它是一款基于 Region 内存布局的,(暂时)不设分代的,使用了读屏障,染色指针和内存多重映射等技术来实现可并发的标记 - 整理算法的,以低延迟为首要目标的一款垃圾收集器 。
它的运作过程大致分为几个阶段:
- 并发标记
- 并发预备重分配
- 并发重分配
- 并发重映射
五、无操作垃圾收集器
1. Epsilon 收集器
一个垃圾收集器除了垃圾收集这个本职工作之外,它还要负责堆的管理与布局,对象的分配,与解释器的协作,与监控子系统的协作,为了隔离垃圾收集器与 Java 虚拟机解释,编译,监控子系统的关系,RedHat 提出了统一的接口,即 JEP 304 提案,Epsilon 是这个接口的有效性验证和参考实现,同时也是用于需要剥离垃圾收集器影响性能测试和压力测试。优点:负载极小,没有任何回收行为。
还没有评论,来说两句吧...