JVM垃圾回收器是什么

发布时间:2022-07-15 10:04:08 作者:iii
来源:亿速云 阅读:140

这篇文章主要讲解了“JVM垃圾回收器是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JVM垃圾回收器是什么”吧!

JVM垃圾回收器是什么

并发与并行

垃圾回收器的分类

1. 按线程数分
按照线程数(用于垃圾回收的)可以分为串行垃圾回收器并行垃圾回收器

JVM垃圾回收器是什么
3. 按碎片处理方式分
按照按工作模式可以分为压缩式垃圾回收器非压缩式垃圾回收器

压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。

7种经典的垃圾回收器

JVM垃圾回收器是什么

垃圾回收器

Serial与Serial Old 回收器

Serial收集器是最基础、历史最悠久的收集器,曾经(在JDK 1.3.1之前)是HotSpot虚拟机新生代收集器的唯一选择。Serial收集器是一个单线程工作的收集器,在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束。
Serial Old是Serial收集器的老年代版本。

JVM垃圾回收器是什么

ParNew 回收器

ParNew收集器实质上是Serial收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之 外,其余的行为包括Serial收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器完全一致。
JVM垃圾回收器是什么

Parallel 与Parallel Old 回收器

Parallel Scavenge收集器也是一款新生代收集器,它同样是基于标记-复制算法实现的收集器,也是 能够并行收集的多线程收集器。
和ParNew收集器不同,Parallel scavenge收集器的目标则是达到一个可控制的吞吐量,它也被称为吞吐量优先的垃圾收集器。

吞吐量:处理器用于运行用户代码的时间与处理器总消耗时间的比值。

高吞吐量可以最高效率地利用处理器资源,尽快完成程序的运算 任务,主要适合在后台运算而不需要太多交互的分析任务。

Parallel Old是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实 现。

JVM垃圾回收器是什么

CMS回收器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。

CMS收集器是基于标记-清除算法实现的,它的运作可以分为四个步骤,包括:

  1. 初始标记
    初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快;

  2. 并发标记
    并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对 象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行;

  3. 重新标记
    重 新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的 标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一 些,但也远比并发标记阶段的时间短;

  4. 并发清除
    清理删除掉标记阶段判断的已经死亡的 对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。

JVM垃圾回收器是什么
CMS收集器无法处理“浮动垃圾”,有可能出现“Con-current Mode Failure”失败进而导致另一次完全“Stop The World”的Full GC的产生。
在CMS的并发标记和并发清理阶段,用户线程是还在继续运行的,程序在运行自然就还会伴随有新的垃圾对象不断产生,但这一部分 垃圾对象是出现在标记过程结束以后,CMS无法在当次收集中处理掉它们,只好留待下一次垃圾收集 时再清理掉。这一部分垃圾就称为“浮动垃圾”。

同样也是由于在垃圾收集阶段用户线程还需要持续运行,那就还需要预留足够内存空间提供给用户线程使用,因此CMS收集器不能像其他收集器那样等待 到老年代几乎完全被填满了再进行收集,必须预留一部分空间供并发收集时的程序运作使用。

CMS是基于“标记-清除”算法实现的收集器,意味着收集结束时会有大量空间碎片产生,空间碎片过多时,将会给大对象分配带来很大麻烦。

为什么不使用标记—压缩算法避免碎片?

因为当并发清除时,用标记—压缩整理内存的话,原来的用户线程使用的内存就无法使用。要保证用户线程继续执行,前提是它运行的资源不受影响。标记—压缩更适合“Stop The World”场景下使用。

G1(Garbage First)回收器

Garbage First开创了收集 器面向局部收集的设计思路和基于Region的内存布局形式,它是一款主要面向服务端应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器,以极高概率满足GC停顿时间的同时,还兼具高吞吐量的性能特征。

G1收集器出现之前的所有其他收集器,垃圾收集的目标范围要么是整个新生代,要么就是整个老年代,再要么就是整个Java堆。而G1可以面向堆内存任何部分来组成回收集(Collection Set)进行回收,衡量标准不再是它属于哪个分代,而 是哪块内存中存放的垃圾数量最多,回收收益最大

G1回收器的特点

1. 并行与并发

2. 分代收集

3. 空间整合

4. 可预测的停顿时间模型

Region里面存在的跨Region引用对象如何解决?

使用记忆集避免全堆作为GC Roots扫描,它的每个Region都维护有自己的记忆集,这些记忆集会记录下别的Region 指向自己的指针,并标记这些指针分别在哪些卡页的范围之内。G1的记忆集在存储结构的本质上是一 种哈希表,Key是别的Region的起始地址,Value是一个集合,里面存储的元素是卡表的索引号。

G1收集器的运作过程

JVM垃圾回收器是什么

7种经典垃圾回收器的比较

JVM垃圾回收器是什么

垃圾回收器组合

JVM垃圾回收器是什么

低延迟垃圾收集器

Shenandoah收集器

Shenandoah也是使用基于Region的堆内存布局,同样 有着用于存放大对象的Humongous Region,默认的回收策略也同样是优先处理回收价值最大的 Region……但在管理堆内存方面,它与G1至少有三个明显的不同之处。

Shenandoah收集器的工作过程大致可以划分为以下九个阶段:

  1. 初始标记:与G1一样,首先标记与GC Roots直接关联的对象,这个阶段仍 是“Stop The World”的,但停顿时间与堆大小无关,只与GC Roots的数量相关。

  2. 并发标记:与G1一样,遍历对象图,标记出全部可达的对象,这个阶段 是与用户线程一起并发的,时间长短取决于堆中存活对象的数量以及对象图的结构复杂程度。

  3. 最终标记:与G1一样,处理剩余的SATB扫描,并在这个阶段统计出回收价值 最高的Region,将这些Region构成一组回收集。最终标记阶段也会有一小段短暂的停顿。

  4. 并发清理:这个阶段用于清理那些整个区域内连一个存活对象都没有找到 的Region。

  5. 并发回收:在这个阶段,Shenandoah要把回收集里面的存活对象先复制一份到其他未被使用的Region之 中。并发回收阶段运行的时间长短取决于回收集的大小。

  6. 初始引用更新:并发回收阶段复制对象结束后,还需要把堆中所有指 向旧对象的引用修正到复制后的新地址,这个操作称为引用更新。引用更新的初始化阶段实际上并未 做什么具体的处理,设立这个阶段只是为了建立一个线程集合点,确保所有并发回收阶段中进行的收 集器线程都已完成分配给它们的对象移动任务而已。初始引用更新时间很短,会产生一个非常短暂的 停顿。

  7. 并发引用更新:真正开始进行引用更新操作,这个阶段是与用户 线程一起并发的,时间长短取决于内存中涉及的引用数量的多少。并发引用更新与并发标记不同,它 不再需要沿着对象图来搜索,只需要按照内存物理地址的顺序,线性地搜索出引用类型,把旧值改为 新值即可。

  8. 最终引用更新:解决了堆中的引用更新后,还要修正存在于GC Roots 中的引用。这个阶段是Shenandoah的最后一次停顿,停顿时间只与GC Roots的数量相关。

  9. 并发清理:经过并发回收和引用更新之后,整个回收集中所有的Region已 再无存活对象,这些Region都变成Immediate Garbage Regions了,最后再调用一次并发清理过程来回收 这些Region的内存空间,供以后新对象分配使用。

ZGC收集器

ZGC和Shenandoah的目标是高度相似的,都希望在尽可能对吞吐量影响不太大的前提下,实现在任意堆内存大小下都可以把垃圾收集的停顿时间限制在十毫秒以内的低延迟。

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

ZGC也采用基于Region的堆内存布局,但 与它们不同的是,ZGC的Region具有动态性——动态创建和销毁,以及动态的区域容量大小。

ZGC的运作过程可分为四个阶段:

  1. 并发标记(:与G1、Shenandoah一样,并发标记是遍历对象图做可达性分析的 阶段,前后也要经过类似于G1、Shenandoah的初始标记、最终标记(尽管ZGC中的名字不叫这些)的 短暂停顿,而且这些停顿阶段所做的事情在目标上也是相类似的。与G1、Shenandoah不同的是,ZGC 的标记是在指针上而不是在对象上进行的,标记阶段会更新染色指针中的Marked 0、Marked 1标志位。

  2. 并发预备重分配:这个阶段需要根据特定的查询条件统计得出 本次收集过程要清理哪些Region,将这些Region组成重分配集。

  3. 并发重分配:重分配是ZGC执行过程中的核心阶段,这个过程要把重分 配集中的存活对象复制到新的Region上,并为重分配集中的每个Region维护一个转发表,记录从旧对象到新对象的转向关系。

  4. 并发重映射:重映射所做的就是修正整个堆中指向重分配集中旧对象的所 有引用。ZGC很巧妙地把并发重映射 阶段要做的工作,合并到了下一次垃圾收集循环中的并发标记阶段里去完成,反正它们都是要遍历所 有对象的,这样合并就节省了一次遍历对象图的开销。一旦所有指针都被修正之后,原来记录新旧 对象关系的转发表就可以释放掉了。

选择合适的垃圾收集器

考虑以下三个问题:

应用程序的主要关注点是什么?

运行应用的基础设施如何?

使用JDK的发行商是什么?版本号是多少?

是ZingJDK/Zulu、OracleJDK、Open-JDK、OpenJ9抑 或是其他公司的发行版?该JDK对应了《Java虚拟机规范》的哪个版本?

怎样选择垃圾回收器

感谢各位的阅读,以上就是“JVM垃圾回收器是什么”的内容了,经过本文的学习后,相信大家对JVM垃圾回收器是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. JVM垃圾回收算法和垃圾回收器是什么?
  2. JVM是什么?JVM的方法有哪些?

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm

上一篇:Python爬虫是什么及怎么应用

下一篇:MySQL事务的ACID特性及并发问题怎么解决

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》