JVM面试(六)垃圾收集器

news2024/12/24 20:53:39

目录

  • 概述
    • STW
    • 收集器的并发和并行
  • Serial收集器
  • ParNew收集器
  • Parallel Scavenge收集器
  • Serial Old收集器
  • Parallel Old收集器
  • CMS收集器
  • Garbage First(G1)收集器

概述

上一章我们分析了垃圾收集算法,那这一章我们来认识一下这些垃圾收集器是如何运用这些算法的。
不同的虚拟机也会提供各种参数,让用户自由的选择使用哪些分代收集器。
如图:
在这里插入图片描述
这里有七种不同的分代收集器,存在连线的证明可以搭配组合使用。 上面的Young部分是新生代收集器,下面的Tenured是老年队收集器。 接下来分析一下各个收集器的运行原理。

STW

了解之前这些收集器之前,我们要先了解一个概念,叫做“Stop the World”,简称STW,就是在运行垃圾收集算法的时候,Java虚拟机中其他所有的用户线程都要停止。 等到GC线程运行完成之后,才会再次运行。

那么对于一些运算实时性要求较高的系统,如果每隔一个小时就要停止几分钟,肯定是受不了的吧。

所以,这些年垃圾收集器不断进化的过程中,也在不断地减少STW的时间,尽量少的影响用户线程。

收集器的并发和并行

从ParNew收集器之后,将会接触到若干款涉及“并发”和“并行”概念的收集器。有必要先解释清楚这两个名词。并行和并发都是并发编程中的专业名词,
在谈论垃圾收集器的上下文语境中,它们可以理解为:

  • 并行(Parallel):并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默认此时用户线程是处于等待状态。
  • 并发(Concurrent):并发描述的是垃圾收集器线程与用户线程之间的关系,说明同一时间垃圾
    收集器线程与用户线程都在运行。由于用户线程并未被冻结,所以程序仍然能响应服务请求,但由于垃圾收集器线程占用了一部分系统资源,此时应用程序的处理的吞吐量将受到一定影响。

Serial收集器

这个收集器是最基础、历史最悠久的收集器。 只看名字就可以知道,它是一个单线程的收集器。但是这个单线程并不是仅仅说只会用一个收集线程去完成垃圾收集工作,重要的是在运行的时候必须要暂停其他所有的用户线程,只有这一个GC线程运行,直到它收集完成。
如图:
在这里插入图片描述
看起来这个像是一个老掉牙的收集器,但是直到今天其实HotSpot虚拟机在客户端模式下,新生代还是用的这个收集器。

因为它虽然是单线程,但是简单高效,在内存资源较少的环境中,它是额外消耗最少得收集器。像一些用户的桌面应用,新生代使用的内存本来就只有几百兆,只要垃圾收集的停顿时间控制在几十毫秒,不是频繁发生收集的话,完全是可以接收的。

所以,Serial收集器对于运行在客户端模式下的虚拟机来说,是也是一个性价比挺高的选择。

ParNew收集器

ParNew收集器实际上就是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集,以减少STW时间之外,其他的配置项控制参数之类,与Serial收集器完全一致。

在这里插入图片描述
这里要说一下,其实ParNew收集器没有什么创新,但是为什么还会作为服务端HotSpot虚拟机,首选的新生代收集器,是因为除了Serial收集器,只有他能与后来的CMS收集器搭配使用。

而CMS收集器是划时代的,真正意义上可以与用户线程并发处理的垃圾收集器,下文详细讲解一下。

回过来继续说ParNew收集器,虽然他在收集阶段实现了多线程收集,减少了STW时间。但是如果在一些单核处理器的环境中,并没有比Serial收集器有更好的表现。

甚至因为线程交互,上下文切换的开销,他的效果还不能百分百超过Serial收集器。

但是,如果处理器的核心数量比较多的话,ParNew收集器的表现还是挺不错的。

Parallel Scavenge收集器

Parallel Scavenge收集器也是新生代收集器,同样是基于标记-复制算法实现的收集器,能够并行收集的多线程处理器。
主要的优点提供了两个参数,用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX:GCTimeRatio参数。

这里的 吞吐量,就是处理用户线程时间,和 总时间的比值。

比如 用户代码+垃圾收集总时间100分钟,其中垃圾回收用了1分钟,那么吞吐量就是99%。

这个吞吐量越高,垃圾收集的停顿时间就越短。收集时间短的话,收集垃圾对象较少,可能发生 的就更频繁。

两个参数搭配使用,我们可以在其中找一个平衡点,尽量减少停顿时间。

Serial Old收集器

就是Serial新生代收集器的老年代版本,同样也是一个单线程收集器,用标记-整理算法来进行收集。
在这里插入图片描述

Parallel Old收集器

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

在这里插入图片描述

CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。(也就是指Stop the World的停顿时间)多数应用于互联网站或者B/S系统的服务器端上。其中“Concurrent”并发是指垃圾收集的线程和用户执行的线程是可以同时执行的。

从名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于标记-清除算法实现的,它的运作过程相对于前面几种收集器来说要更复杂一些,整个过程分为四个步骤,包括:

  1. 初始标记(CMS initial mark)
  2. 并发标记(CMS concurrent mark)
  3. 重新标记(CMS remark)
  4. 并发清除(CMS concurrent sweep)

在这里插入图片描述

但其实后面还有三个步骤:

  • 并发预清理 CMS-concurrent-preclean-start
  • 并发可中断预清理 concurrent-abortable-preclean
  • 并发重置 CMS Final Remark

注意:“标记”是指将存活的对象和要回收的对象都给标记出来,而“清除”是指清除掉将要回收的对象。
其中,初始标记、重新标记这两个步骤仍然需要“Stop The World”。

  1. 初始标记只是标记⼀下GC Roots能直接关联到的对象,速度很快。
  2. 并发标记阶段就是进行GC Roots Tracing的过程。(其实就是从GC Roots开始找到它能引用的所有其它对象,不会影响用户的线程)
  3. 重新标记阶段则是为了修正并发标记期间因用户程序继续动作而导致标记产生变动的那⼀部分对象的标记记录,这个阶段的停顿时间⼀般会比初始标记阶段稍长⼀些,但远比并发标记的时间短。
  4. CMS收集器的动作步骤如图所示,在整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与⽤户线程⼀起工作,因此,从总体上看,CMS收集器的内存回收过程是与用户线程⼀起并发执行的;

优点就是可以并发收集、低停顿时间。降低GC线程在清理垃圾的过程中对用户线程的暂停时间。

缺点呢,就是标记清除算法回收完垃圾之后,没有整理内存,会产生大量的内存碎片。
还有就是比较消耗CPU资源,因为是并发多线程的,所以如果处理器核心数量低于4个的话,执行速度肯定会大幅度下降的。

注意:如果CMS垃圾收集器回收的时候,预留的内存无法满足程序分配的新对象需要。那么就会出现并发失败的报错“Concurrent Mode Failure”。
这个时候会触发临时方案,转而使用Serial Old收集器来进行处理,那么这种串行收集器的停顿时间肯定会偏长。

PS:这里还有一个FullGC 的概念,就是新生代、老年代同时发生垃圾回收。 当大对象在新生代放不下,只能进入老年代的时候,或者是新生代对象晋升到老年代的时候。如果进行了Old GC过程中依然发现空间不足无法放下的时候,就会进行Full GC。

Garbage First(G1)收集器

简称G1收集器,它属于里程碑式的发展,开创了面向局部收集垃圾的概念。专门针对多核处理器以及大内存的机器。在JDK9中,更是呗指定为官方的GC收集器。满足高吞吐的通知满足GC的STW停顿时间尽可能的短。

  • 它把堆内存分割为很多不相关的区域(Region) (物理上不连续的)。使用不同的Region来表示Eden、幸存者(S0)区,幸存者(S1)1区,老年代等。
  • G1 GC有计划地避免在整个Java 堆中进行全区域的垃圾收集。G1跟踪各个Region 里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护⼀个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。
    在这里插入图片描述

优点就是可以同时多个GC线程同时执行,在不同的Region中分割处理,并且其他的Region中用户的线程是正常执行。

而且,G1也是有新生代和老年代的概念,但也是标记不同的Region来实现,也就是说 新生代和老年代的位置并不是固定的。

而且,当 内存不足时候,可以通过算法预测清理哪些Region是最高效的,这样STW停顿时间就在一个可控的范围内。

缺点就是只适用于多核处理器和大内存主机。

我们后面可以单开文章,来详细剖析一下CMS收集器和G1收集器具体的实现逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2109481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

某云彩SRM2.0任意文件下载漏洞

文章目录 免责申明搜索语法漏洞描述漏洞复现修复建议 免责申明 本文章仅供学习与交流,请勿用于非法用途,均由使用者本人负责,文章作者不为此承担任何责任 搜索语法 fofa icon_hash"1665918155"漏洞描述 某云采 SRM2.0是一款先…

制作自己的游戏:打砖块

文章目录 🚀 前言🚀 前期准备🚀 玩法设计🚀 游戏场景🍓 什么是游戏场景🍓 绘制左上角积分🍓 绘制右上角生命值🍓 绘制砖块🍓 绘制小球🍓 绘制挡板&#x1f35…

场景是人工智能第四要素,是垂直领域人工智能的第一要素。

"场景是人工智能的第四要素,与数据、算力、算法同等重要。"拿着技术找场景,还是拿着场景找技术?这个锤子和钉子的问题,一直困扰着各家AI大厂。从近5年的实践来看,拿着场景找技术是更为稳健的,否则…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《面向电网调峰的聚合温控负荷多目标优化控制方法 》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

R901085689比例流量控制阀配置HE-SP1比例放大器

R901085689比例流量控制阀配置HE-SP1比例放大器的功能是将电信号转换成对应的流量变化,通过调整阀门开度来控制介质的流量。这种转换是通过比例电磁铁实现的,它将输入的电流信号转换成力或位移,从而驱动阀芯移动,实现流量的连续调…

html+css+js网页设计 珠宝首饰模版13个页面

htmlcssjs网页设计 珠宝首饰模版13个页面 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&…

手机同时传输USB功能与充电的实现及LDR6500的作用

在智能设备日益普及的今天,用户对于手机的功能需求愈发多样化,其中同时实现USB数据传输与充电功能成为了许多用户的迫切需求。这一功能的实现离不开先进的硬件技术和创新的芯片解决方案,而LDR6500正是这样一款能够满足这一需求的USB PD&#…

uni-app 扫码优化:谈谈我是如何提升安卓 App 扫码准确率的

一. 前言 之前的一个项目遭到用户吐槽:“你们这个 App 扫码的正确率太低了,尤其是安卓的设备。经常性的扫码扫不出来,就算是扫出来了,也是错误的结果!” 由于之前是扫描二维码的需求,所以没有对扫描条形码…

yolov8-obb旋转目标检测onnxruntime和tensorrt推理

onnxruntime推理 导出onnx模型: from ultralytics import YOLO model YOLO("yolov8n-obb.pt") model.export(format"onnx") onnx模型结构如下: python推理代码: import cv2 import math import numpy as np impo…

全面提升管理效率的智慧园区可视化系统

通过图扑 HT 搭建智慧园区可视化,实时监测和展示园区内各设施的状态与能耗,优化资源配置,提升园区管理效率。

科普神文,一次性讲透AI大模型的核心概念

令牌,向量,嵌入,注意力,这些AI大模型名词是否一直让你感觉熟悉又陌生,如果答案肯定的话,那么朋友,今天这篇科普神文不容错过。我将结合大量示例及可视化的图形手段,为你由浅入深一次…

电脑怎么禁止软件联网?电脑怎么限制软件上网?方法很多,这三种最常用!

在日常使用电脑时,某些软件可能会自动联网,这不仅会消耗网络资源,还可能带来安全风险。此外企业老板考虑到公司员工可能会在工作期间访问无关软件,影响工作效率,因此,很多用户希望能够禁止某些软件联网&…

springboot学生社团管理系统—计算机毕业设计源码26281

目录 摘要 Abstract 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析…

C语言 10 数组

简单来说,数组就是存放数据的一个组,所有的数据都统一存放在这一个组中,一个数组可以同时存放多个数据。 一维数组 比如现在想保存 12 个月的天数,那么只需要创建一个 int 类型的数组就可以了,它可以保存很多个 int …

Linux网络编程IO管理

网络 IO 涉及到两个系统对象,一个是用户空间调用 IO 的进程或者线程,一个是内核空间的内核系统,比如发生 IO 操作 read 时,它会经历两个阶段: 等待内核协议栈的数据准备就绪;将内核中的数据拷贝到用户态的…

vue3 json格式化显示数据(vue3-json-viewer) 对比修改前后数据

需求:对比变更前后数据 npm包下载 npm install vue3-json-viewer --savemain.ts中全局引用 // json可视化 import JsonViewer from "vue3-json-viewer" import "vue3-json-viewer/dist/index.css";app.use(JsonViewer).mount("#app&quo…

鸿蒙界面开发——组件(6):属性字符串(StyledString)文本输入

属性字符串StyledString/MutableStyledString MutableStyledString继承于StyledString,以下统一简称StyledString。 是功能强大的标记对象,可用于字符或段落级别设置文本样式。 通过将StyledString附加到文本组件, 可以通过多种方式更改文本…

深度学习-用神经网络NN实现足球大小球数据分析软件

文章目录 前言一、 数据收集1.1特征数据收集代码实例 二、数据预处理清洗数据特征工程: 三、特征提取四、模型构建五、模型训练与评估总结 前言 预测足球比赛走地大小球(即比赛过程中进球总数是否超过某个预设值)的深度学习模型是一个复杂但有…

霍尼韦尔、书客、米家护眼大路灯怎么样?终极测评对比和护眼灯王者机型

霍尼韦尔、书客、米家护眼大路灯怎么样?护眼大路灯的重要性不容忽视,它是我们日常生活中用眼的必备工具,也是眼睛能够得到保护重要一环。近年来,护眼大路灯市场呈现出国际大牌的垄断局面,但这也带来了一些问题。为了争…

油猴插件录制请求,封装接口自动化参数

参考:如何使用油猴插件提高测试工作效率 一、背景 在酷家乐设计工具测试中,总会有许多高频且较繁琐的工作,比如: 查询插件版本:需要打开Chrome控制台,输入好几个命令然后过滤出版本信息。 查询模型商品&…