JVM垃圾回收器详解(3)

JVM垃圾回收器详解(3)

垃圾收集算法

标记-清除算法

​ 标记-清除算法(Mark-and-Sweep)算法为“标记(Mark)“ 和 ”清除(Sweep)“ 阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。

​ 它是最基础的收集算法,后续的算法都是对其不足进行改进得到。这种垃圾收集算法会带来两个明显的问题:

  1. **效率问题:**标记问题和清除两个过程效率都不高。
  2. **空间问题:**标记清除后会产生大量不连续的内存碎片

标记-清除算法

​ 关于具体是标记可回收对象还是不可回收对象,众说纷纭,两种说法其实都没有问题,个人更倾向于是前者。

​ 如果按照前者的理解,整个标记-清除过程大致是这样的

  1. 当一个对象被创建时,给一个标记位,假设为0(false);
  2. 在标记阶段,我们将所有可达对象(或者用户可以引用的对象)的标记位设置为1(true);
  3. 扫描阶段清除的就是标记为0(false)的对象。
复制算法

​ 为了解决标记-清除算法的效率和内存碎片问题,复制(Copying)收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。

复制算法

​ 虽然改进了标记-清除算法,但依然存在下面这些问题:

  • 可用内存变小:可用内存缩小为原来的一半。
  • 不适合老年代:如果存活对象数量比较大,复制性能会变得比较差。
标记-整理算法

​ 标记整理算法(Mark-and-Compact)算法是根据老年代的特点提出的一种标记算法,标记过程仍然与”标记-清除“算法一样,但后续步骤不是直接对可回收对象进行回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界外的内存。

标记-整理算法

​ 由于多了整理这一步,因此效率也不高,适合老年代这种垃圾回收频率不是很高的场景。

分代收集算法

​ 当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将 Java 堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

​ 比如在新生代中,每次收集都会有大量的对象死去,所以可以选择 ”标记-复制算法“,只需要付出少量的对象的复制成本就可以完成每次的垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对他进行分配担保,所以我们必须选择”标记-清除“或者”标记-整理“算法进行垃圾收集。

G1 收集器

G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征.

被视为 JDK1.7 中 HotSpot 虚拟机的一个重要进化特征。它具备以下特点:

  • 并行与并发:G1 能充分利用 CPU、多核环境下的硬件优势,使用多个 CPU(CPU 或者 CPU 核心)来缩短 Stop-The-World 停顿时间。部分其他收集器原本需要停顿 Java 线程执行的 GC 动作,G1 收集器仍然可以通过并发的方式让 java 程序继续执行。
  • 分代收集:虽然 G1 可以不需要其他收集器配合就能独立管理整个 GC 堆,但是还是保留了分代的概念。
  • 空间整合:与 CMS 的“标记-清除”算法不同,G1 从整体来看是基于“标记-整理”算法实现的收集器;从局部上来看是基于“标记-复制”算法实现的。
  • 可预测的停顿:这是 G1 相对于 CMS 的另一个大优势,降低停顿时间是 G1 和 CMS 共同的关注点,但 G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为 M 毫秒的时间片段内,消耗在垃圾收集上的时间不得超过 N 毫秒。

G1 收集器的运作大致分为以下几个步骤:

  • 初始标记
  • 并发标记
  • 最终标记
  • 筛选回收

G1 收集器

G1 收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的 Region(这也就是它的名字 Garbage-First 的由来) 。这种使用 Region 划分内存空间以及有优先级的区域回收方式,保证了 G1 收集器在有限时间内可以尽可能高的收集效率(把内存化整为零)。

从 JDK9 开始,G1 垃圾收集器成为了默认的垃圾收集器。

收集器在有限时间内可以尽可能高的收集效率(把内存化整为零)。

从 JDK9 开始,G1 垃圾收集器成为了默认的垃圾收集器。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值