当前位置: 首页 > 图灵资讯 > 技术篇> Java中jvm垃圾回收详解

Java中jvm垃圾回收详解

来源:图灵教育
时间:2023-07-23 16:55:52

(垃圾回收器)

<B>串行:指垃圾回收器与用户线程的交替,这意味着用户线程在执行垃圾回收器时需要平行暂停:指垃圾回收器和用户线程同时执行,除cms和G1外,其他垃圾回收器是串行执行的

在这里插入图片描述

1.Serial收集器

Serial翻译成串行,即串行执行。它是一个单线程的收集器,只使用一个线程进行垃圾回收。优点是简单高效。对于单个cpu环境,没有线程切换成本,收集率高。它是client(客户端)模式下默认的垃圾回收器

在这里插入图片描述

2.parnew收集器

它是serial收集器的多线程版本,是server模式下虚拟机的首选新一代收集器。除了性能原因,主要原因是除了serial收集器,只有它可以与cms收集器默认打开的线程数量相同,可以与cpu数量相同-xx:parllelGCThreads参数设置线程数

在这里插入图片描述

3 .parallel Scavenge收集器

和parnew一样,其他多线程收集器的重点是在垃圾回收过程中尽可能缩短用户线程的停顿时间,其目标是达到可控的吞吐量。它被称为吞吐量优先收集器。这里的吞吐量值得cpu运行用户代码的时间占总时间的比例。停顿时间越短,就越适合需要与用户互动的应用程序。良好的响应速度可以提高用户体验。以牺牲吞吐量和新一代空间为代价,高吞吐量可以有效利用cpu时间,尽快完成任务,缩短停顿时间: 新一代空间变小,垃圾回收频繁,导致吞吐量下降。可以通过开关参数打开 GC 自适应调整策略(GC Ergonomics),没有必要手动指定新一代的大小(-Xmn)、Eden 和 Survivor 细节参数,如区域比例、晋升老年对象年龄等。可以通过开关参数打开 GC 自适应调整策略(GC Ergonomics),没有必要手动指定新一代的大小(-Xmn)、Eden 和 Survivor 区域比例、老年人年龄等细节参数。虚拟机会根据当前系统的运行情况收集性能监控信息,并动态调整这些参数,以提供最合适的停顿时间或最大的吞吐量。

4.Serial Old

它是serial收集器的老版本,也用于client模式下的虚拟机。如果在server模式下,它有两个主要用途:

  • jdk1.5和之前的版本(parallel 在old诞生之前,与parallel收集器一起使用
  • Concurentt作为cms收集器的后备计划,并发收集 Mode 使用Failure时使用
5.parallel old收集器

是parallel scavenge收集器的老年版在注重吞吐量和cpu资源敏感的情况下优先考虑paralelel Scavenge 加parallel old收集器

在这里插入图片描述

6.cms

在这里插入图片描述

Concurrent Mark Sweep,Mark Sweep是指标记清除算法分为以下四个过程:

  • 初始标记:只标记GC root可以直接与对象相关,速度快,需要停顿
  • 并发性标记:GC root Tracing的过程在整个回收过程中耗时最长,不需要停顿
  • 重新标记:需要停止修改并发标记期间因用户程序继续运行而导致标记变化的部分标记。
  • 并发清除: 不需要停顿。

在整个过程中最耗时的并发标记和并发清除过程中,收集器线程可以与用户线程一起工作,无需停止。吞吐量低的缺点如下: 低停顿时间以牺牲吞吐量为代价,导致 CPU 利用率不够高。浮动垃圾无法处理,可能会发生 Concurrent Mode Failure。浮动垃圾是指用户线程在并发清除阶段继续运行而产生的垃圾。这部分垃圾只能到下一次 GC 只有回收时才能进行。由于浮动垃圾的存在,需要预留部分内存,这意味着 CMS 收集不能像其他收集器一样等待老年人满了再回收。如果预留的内存不足以储存浮动垃圾,就会出现 Concurrent Mode Failure,此时,虚拟机将临时启用 Serial Old 来替代 CMS。标记 - 清除算法造成的空间碎片往往有老年空间剩余,但无法找到足够大的连续空间来分配当前对象,必须提前触发 Full GC。

7. G1 收集器

G1(Garbage-First),它是一种面向服务端的垃圾收集器,在多 CPU 和大内存的场景有很好的性能。HotSpot 开发团队赋予它的使命是在未来取代它 CMS 收集器。堆被分为新一代和老一代,其他收集器的收集范围是整个新一代或老一代,而 G1 新生代和老年代可以直接回收。

<A>G1 将堆划分为多个大小相等的独立区域(Region),新生代和老年代不再物理隔离

通过引入 Region 概念将原来的整个内存空间划分为多个小空间,使每个小空间都能单独回收垃圾。这种划分方法带来了很大的灵活性,使得可预测的停顿时间模型成为可能。记录每一个 Region 垃圾回收时间和回收获得的空间(这两个值是通过过去的回收经验获得的),并根据允许的收集时间保持优先列表,优先考虑最大的回收价值 Region。每个 Region 都有一个 Remembered Set,用来记录该 Region 引用对象所在 Region。通过使用 Remembered Set,在进行可达性分析时,可以避免全堆扫描。

若不计算维护 Remembered Set 的操作,G1 收集器的运行大致可分为以下步骤:初始标记并发标记最终标记: 为了纠正用户程序在并发标记期间继续运行导致标记变化的部分标记,虚拟机将在线程中记录对象的变化 Remembered Set Logs 里面,需要在最后的标记阶段进行标记 Remembered Set Logs 数据合并到 Remembered Set 中。这一阶段需要停止线程,但可以并行执行。这一阶段需要停止线程,但可以并行执行。筛选回收: 首先对各个 Region 根据用户所期望的回收价值和成本进行排序 GC 暂停时间制定回收计划。事实上,在这个阶段,它也可以与用户程序并发执行,但因为它只回收部分 Region,用户可以控制时间,用户线程的停顿将大大提高收集效率。具有以下特点:空间整合: 总的来说,它是基于“标记” - 从局部(两个)对算法实现的收集器进行分类 Region 之间)是基于“复制”算法实现的,这意味着在运行过程中不会产生内存空间碎片。可预测的停顿: 能让用户明确指定一个长度 M 在毫秒的时间段内,消耗在毫秒的时间段内 GC 时间不得超过 N 毫秒。