经典垃圾收集器

[Q&A] 什么是串行收集器Serial Collector?
以串行模式工作的收集器;

[Q&A]什么是并行收集器Paraller Collector?
以并行模式工作的收集器;

[Q&A]垃圾收集里并行指的什么?
并行(Parallel)【美 /ˈpærəlel/】:并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默认此时用户线程是处于等待状态

[Q&A]垃圾收集里并发指的什么?
并发(Concurrent)【美 /kənˈkɜːrənt/】:并发描述的是垃圾收集器线程用户线程之间的关系,说明同一时间垃圾收集器线程与用户线程都在运行。由于用户线程并未被冻结,所以程序仍然能响应服务请求,但由于垃圾收集器线程占用了一部分系统资源,此时应用程序的处理的吞吐量将受到一定影响。
-----------------------------------------------------------------------------读书笔记摘自 书名:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)作者:周志明

在这里插入图片描述
[Q&A] 什么是吞吐量?
吞吐量(Throughput): 吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间)
如虚拟机总运行了 100 分钟,其中垃圾收集花掉 1 分钟,那吞吐量就是99%。
在这里插入图片描述

[Q&A] 什么是Stop-the-world?
Stop-the-world:GC线程与应用线程保持相对独立,当系统需要执行垃圾回收任务时,先停止工作线程,应用程序进入暂停状态,然后命令 GC 线程工作。
一般STW会导致用户体验不好,要是你的电脑每运行一个小时就会暂停响应五分钟,你会有什么样的心情?

[Q&A] 什么是SafePoint?
每当发生一次垃圾收集的动作,所有的用户线程都必须跑到最近的一个安全点(SafePoint),然后挂起线程等待垃圾回收。
在这里插入图片描述

垃圾回收器梗概

在这里插入图片描述
上图展示了七种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用,图中收集器所处的区域,则表示它是属于新生代收集器抑或是老年代收集器。

Serial 收集器 【新生代】

1、单线程收集器
2、 “Stop The World”
3、 新生代采用标记-复制算法,老年代采用标记-整理算法。
4、 运行在 Client 模式下的虚拟机来说是个不错的选择。

在这里插入图片描述

Serial Old 收集器 【老年代】

Serial 收集器的老年代版本
在这里插入图片描述

ParNew 收集器 【新生代】

1.、Serial 收集器的多线程版本
2、“Stop The World”
3、新生代采用标记-复制算法,老年代采用标记-整理算法。
4、它是许多运行在 Server 模式下的虚拟机的首要选择

在这里插入图片描述

Parallel Scavenge 收集器 【新生代】

【 美 /ˈpærəlel/】【美 /ˈskævɪndʒ/】

  1. 多线程收集器,它看上去几乎和 ParNew 都一样,关注点是吞吐量
  2. “Stop The World”
  3. 新生代采用标记-复制算法,老年代采用标记-整理算法。
  4. 这是 JDK1.8 默认收集器

Parallel Old 收集器 【老年代】

Parallel Scavenge 收集器的老年代版本
在这里插入图片描述

CMS收集器 Concurrent Mark Sweep【老年代】

1、HotSpot 虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。CMS收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用。

2.、初始标记、重新标记这两个步骤仍然需要“Stop The World”。
3.、CMS是一款基于“标记-清除”算法实现的收集器
4、缺点:
对 CPU 资源敏感;
无法处理浮动垃圾;
它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。

在这里插入图片描述

G1 收集器(Garbage-First)【新+老】

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

在这里插入图片描述
-----------------------------------------------------------------------------读书笔记摘自 书名:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)作者:周志明
在这里插入图片描述

垃圾回收器回收步骤

年轻代

串行GC(Serial Copying)/Serial 收集器

1.算法:复制(copying)清理算法

2.操作步骤:
2.1扫描年轻代中所有存活对象
2.2使用Minor GC进行垃圾回收,同时将存活的对象保存到S0/S1区。
2.3在上一次Minor GC的基础上进行S0和S1区的角色交换。
2.4经历过多次Minor GC依然存活的对象晋升到老年代。

3.串行收集器采用单线程方式进行收集,且在 GC 线程工作时,系统不允许应用线程打扰。此时,应用程序进入暂停状态,即 Stop-the-world。Stop-the-world 暂停时间的长短,是衡量一款收集器性能高低的重要指标

并行GC(ParNew)/ParNew 收集器

1.算法:复制(copying)清理算法
2.操作步骤:
并行GC(ParNew)必须结合老年代CMS GC一起使用。因为在年轻代如果发生了Minor GC时,老年代也需要使用CMS GC同时处理。因为并行回收GC并不会做这些。
3.可以看成是 Serial 的多线程版本,采用多个 GC 线程并行收集。多条 GC 线程执行显然比只使用一条 GC 线程执行的效率更高。一般来说,与串行收集器相比,在多处理器环境下工作的并行收集器能够极大地缩短 Stop-the-world 时间。

并行回收GC(Parallel Scavenge)/Parallel Scavenge 收集器

1.算法:复制(copying)清理算法
2.操作步骤
在扫描和复制时均采用多线程方式处理,并行回收GC为空间较大的年轻代回收提供许多优化。
3.和 ParNew 类似,但更注重吞吐率。在 ParNew 的基础上演化而来的 Parallel Scanvenge 收集器被誉为“吞吐量优先”收集器。
Parallel Scanvenge 收集器在 ParNew 的基础上提供了一组参数,用于配置期望的收集时间或吞吐量,然后以此为目标进行收集。通过 VM 选项可以控制吞吐量的大致范围:

-XX:MaxGCPauseMills:设置并行收集器最大暂停时间,单位为ms,用来控制收集对应用程序停顿的影响。
-XX:GCTimeRatio:设置垃圾回收时间占程序运行时间的百分比,用来控制吞吐量。
-XX:UseAdaptiveSizePolicy:自动分代大小调节策略。

但要注意停顿时间与吞吐量这两个目标是相悖的,降低停顿时间的同时也会引起吞吐的降低。因此需要将目标控制在一个合理的范围中。

老年代

串行GC(Serial MSC)/Serial Old 收集器

1.算法:标记-清除-压缩(mark-sweep-compact)/“标记-整理”算法
2.操作步骤:
2.1扫描老年代中还存活的对象,并对这些对象进行标记
2.2遍历整个老年代的内存空间,回收所有未标记的对象内存。
2.3将所有存活对象都集中在一端,然后把所有被回收的对象的内存空间变成一块连续的内存空间。
4.Serial Old 是 Serial 收集器的老年代版本,单线程收集器。这个收集器的主要意义也是在于给 Client 模式下的虚拟机使用。
优缺点:串行执行为单线程,需要暂停应用并耗时较长

并行GC(Parallel Mark Sweep,Parallel Compacting)/Parallel Old 收集器

1.算法:标记-清除-压缩(mark-sweep-compact)/采用“标记-整理”算法。
2.操作步骤:
2.1将老年代内存空间按照线程个数划分为若干个子区域
2.2多个线程并行对各自子区域内存活对象进行标记
2.3多个线程并行清除所有的未标记的对象
2.4多个线程并行将多个存活的对象整理在一起,并将所有的被回收的对象空间整合为一体。
3.Parallel Old 是 Parallel Scanvenge 收集器的老年代版本,多线程收集器。
优缺点:多线程可以缩短应用的暂停时间,因为老年代较大,扫描和标记较费时。

并发GC(Concurrent Mark-Sweep GC,CMS GC)/CMS收集器

1.算法:标记-清除(mark-sweep)
2.操作步骤:
2.1初始标记(STW Initial Mark):
虚拟机暂停正在执行的任务,由根对象扫描出所有的关联对象,并作出标记,此过程只会导致JVM短暂暂停。
2.2并发标记(Concurrent Marking):
恢复所有暂停的线程对象,并对之前标记的对象进行扫描,取得所有跟标记对象有关的对象。
2.3并发预清理(Concurrent Precleaning):
查找所有在并发标记阶段进入老年代的对象。
2.4重新标记(STW Remark):
此阶段会暂停虚拟机,对在并发标记阶段被改变引用或者重新创建的对象进行标记。重新标记阶段则是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。这个阶段的停顿时间一般会比初始阶段稍长一些,但远比并发标记的时间短。
2.5并发清理:
恢复所有暂停的应用线程,对所有未标记的垃圾对象进行清理,并且尽量将已经回收的对象的空间拼凑成一个整体,在此阶段收集器线程和应用程序线程并发执行。
2.6并发重置:
重置CMS收集器的数据结构,等待下一次垃圾回收。
3.CMS(Concurrent Mark Swee)收集器是一种以获取最短回收停顿时间为目标的收集器。

CMS 以流水线方式拆分了收集周期,将耗时长的操作单元保持与应用线程并发执行。只将那些必需 STW 才能执行的操作单元单独拎出来,控制这些单元在恰当的时机运行,并能保证仅需短暂的时间就可以完成。这样,在整个收集周期内,只有两次短暂的暂停(初始标记和重新标记),达到了近似并发的目的。
CMS 收集器之所以能够做到并发,根本原因在于采用基于“标记-清除”的算法并对算法过程进行了细粒度的分解。前面已经介绍过“标记-清除”算法将产生大量的内存碎片这对新生代来说是难以接受的,因此新生代的收集器并未提供 CMS 版本

CMS 收集器优点:并发收集,低停顿。
CMS 收集器缺点:
    CMS 收集器对 CPU 资源非常敏感,并发标记与回收线程会与应用程序争抢CPU资源;
    CMS 收集器无法处理浮动垃圾;
    CMS 收集器是基于“标记-清除”算法,该算法的缺点都有,比如容易产生内存碎片

GC策略调整参数

默认情况

在这里插入图片描述

具体搭配情况

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

参考

UseParallelGC和UseParallelOldGC的区别。参考: https://www.cnblogs.com/kelthuzl.
大神的参考链接: https://blog.csdn.net/.
参照大神链接: 深入理解 JVM 垃圾回收机制及其实现原理.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值