垃圾回收算法和垃圾回收器

本文皆参考 深入理解java虚拟机第三版

垃圾回收算法:

垃圾回收算法可分为“引用计数式垃圾收集”和“追踪式垃圾回收”。
引用计数式垃圾收集在主流java虚拟机中没有涉及到,所有以下皆是属于追踪式垃圾回收。

分代收集理论:

当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”的理论进行设计。
设计师一般把Java堆划分为新生代和老年代。我们可以根据各个年代的特点选择合适的垃圾回收算法。
比如 在新生代中,每次收集都会有大量对象死去,所以可以选择“标记-复制”算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。
而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。

1、标记-清除算法

它是最早出现也是最基础的垃圾收集算法。
算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记后,统一回收所有被标记的对象。也可以反过来,标记存活的对象,统一回收未被标记的对象。
后续算法大多是以它为基础对其缺点改进得到的。
它的缺点主要有两个:
(1)执行效率不稳定
如果java堆中包含大量对象,其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,这时标记和清除两个过程的执行效率会随着对象数量的增长而降低。
(2)内存空间的碎片化问题
标记、清除后会产生大量不连续的内存碎片,空间碎片太多会导致以后在分配内存较大的对象时找不到足够的连续的内存空间。

2、标记-复制算法

为了解决标记-清除算法在面对大量对象时执行效率低的问题,提出了该算法。
它可以将内存分为大小相同的两块,每次使用其中一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次性清理掉。
这样分配时就不用考虑有空间碎片的问题,但是代价是将原本可用的内存空间变为原来的一半,造成了空间浪费。
现在大多使用这个收集算法去回收新生代,适合对象存活率低的时代。

3、标记-整理算法

针对老年代的特点提出的一种算法。
标记过程和“标记-清除”算法一样,但是后序步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。

垃圾收集器

1、Serial收集器

是最基础的、历史最悠久的收集器。它是一个单线程工作的收集器,在进行垃圾收集时,必须暂停其他所有工作线程,直到它收集完毕。
虽然它出现最早,但是它有优于其他收集器的地方,那就是简单高效。
对于内存资源受限的环境,它是所有收集器里额外内存消耗最小的。

2、ParNew收集器

它本质上是Serial收集器的多线程并发版本,除了使用多线程进行垃圾收集外,其余行为(控制参数、收集算法、回收策略等)和Serial收集器完全一样。
它是许多运行在Server模式下的虚拟机的首要选择,除了Serial收集器外,只有它能与CMS收集器配合工作。
并行和并发的区别:
并行:
描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默认此时用户线程是处于等待状态。
并发:
描述的是垃圾收集器线程与用户线程之间的关系,说明同一时间内垃圾收集器线程与用户线程都在运行。

3、Parallel Scavenge 收集器

是一款新生代收集器。它的关注点与其他收集器不同。CMS收集器关注的是尽量可能缩短垃圾收集时用户线程的停顿时间。而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。(吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值)
这是JDK1.8默认收集器。

4、Serial Old收集器

Serial 收集器的老年代版本,它同样是一个单线程收集器。
主要有两大用途:
一种是在JDK1.5以及以前版本中与Parallel Scavenge收集器搭配使用;
另一种是作为CMS收集器的后备方案。

5、Parallel Old收集器

是Parallel Scavenge收集器的老年代版本。
使用多线程和“标记-整理算法”,在注重吞吐量以及CPU的场合,可以优先考虑 Parallel Scavenge收集器和Parallel Old收集器。

6、CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
它是基于标记-清除算法实现的,它的运行过程相对于前面几种收集器更复杂些,整个过程分为四个步骤:
(1)初始标记:
标记一下GC Roots能直接关联到的对象,速度很快。
(2)并发标记
从 GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长,但是不需要停顿用户线程,可以与垃圾回收线程一起并发运行。
(3)重新标记
重新标记阶段则是为了修正并发标记期间,因用户程序继续运行而导致标记发生变动的那一部分对象的标记记录。
(4)并发清除
清理删除掉标记阶段判断已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程并发进行的。
它的优点有:
并发收集、低停顿。
它的缺点是:
(1)对CPU资源敏感;
(2)无法处理浮动垃圾
(3)它使用的回收算法“标记-清除”算法会导致收集结束时有大量空间碎片产生。

7、Garbage First 收集器

简称为G1收集器,它是一款面向服务器的垃圾收集器,只要针对配备多颗处理器及大容量内存的机器,以极高概率满足GC停顿时间要求的同时,还具备吞吐量性能特征。
它有以下特点:
(1)并行与并发;
(2)分代收集
(3)空间整合
(4)可预测的停顿
G1收集器的运行大致有以下步骤:
(1)初始标记
(2)并发标记
(3)最终标记
(4)筛选回收

8、ZGC回收器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值