JVM面试(六)垃圾收集器
目录
- 概述
- 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收集器是基于标记-清除算法实现的,它的运作过程相对于前面几种收集器来说要更复杂一些,整个过程分为四个步骤,包括:
- 初始标记(CMS initial mark)
- 并发标记(CMS concurrent mark)
- 重新标记(CMS remark)
- 并发清除(CMS concurrent sweep)
但其实后面还有三个步骤:
- 并发预清理 CMS-concurrent-preclean-start
- 并发可中断预清理 concurrent-abortable-preclean
- 并发重置 CMS Final Remark
注意:“标记”是指将存活的对象和要回收的对象都给标记出来,而“清除”是指清除掉将要回收的对象。
其中,初始标记、重新标记这两个步骤仍然需要“Stop The World”。
- 初始标记只是标记⼀下GC Roots能直接关联到的对象,速度很快。
- 并发标记阶段就是进行GC Roots Tracing的过程。(其实就是从GC Roots开始找到它能引用的所有其它对象,不会影响用户的线程)
- 重新标记阶段则是为了修正并发标记期间因用户程序继续动作而导致标记产生变动的那⼀部分对象的标记记录,这个阶段的停顿时间⼀般会比初始标记阶段稍长⼀些,但远比并发标记的时间短。
- 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收集器具体的实现逻辑。
相关文章:

JVM面试(六)垃圾收集器
目录 概述STW收集器的并发和并行 Serial收集器ParNew收集器Parallel Scavenge收集器Serial Old收集器Parallel Old收集器CMS收集器Garbage First(G1)收集器 概述 上一章我们分析了垃圾收集算法,那这一章我们来认识一下这些垃圾收集器是如何运…...

固态硬盘装系统有必要分区吗?
前言 现在的新电脑有哪一台是不使用固态硬盘的呢?这个好像很少很少了…… 有个朋友买了一台新的笔记本电脑,开机之后,电脑只有一个分区(系统C盘500GB)。这时候她想要给笔记本分区…… 这个真的有必要分区吗…...

网络安全架构师
网络安全架构师负责构建全面的安全框架,以保护组织的数字资产免受侵害,确保组织在数字化转型的同时维持强大的安全防护。 摩根大通的网络安全运营副总裁兼安全架构总监Lester Nichols强调,成为网络安全架构师对现代企业至关重要,…...

如何本地部署Ganache并使用内网穿透配置公网地址远程连接测试网络
目录 前言 1. 安装Ganache 2. 安装cpolar 3. 创建公网地址 4. 公网访问连接 5. 固定公网地址 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊如何本地部署Ganache并使用内网穿透配置公网地址远程连接测试网络,欢迎大家点赞 &a…...
算法岗/开发岗 实况
深信服算法岗一面 第一题 树的直径有哪些解法 两次dfs和树形dp,讲了一下树形dp的思路 因为我的简历写的比较少,所以面试官问我一些个人信息和擅长哪方面。 我说:ACM大一下打到大三,然后去考研。dp写的多一点,还有思维…...

Nginx跨域运行案例:云台控制http请求,通过 http server 代理转发功能,实现跨域运行。(基于大华摄像头WEB无插件开发包)
文章目录 引言I 跨域运行案例开发资源测试/生产环境,Nginx代理转发,实现跨域运行本机开发运行II nginx的location指令Nginx配置中, 获取自定义请求header头Nginx 配置中,获取URL参数引言 背景:全景监控 需求:感知站点由于云台相关操作为 http 请求,http 请求受浏览器…...

【数据分析预备】Pandas
Pandas 构建在NumPy之上,继承了NumPy高性能的数组计算功能,同时提供更多复杂精细的数据处理功能 安装 pip install pandas导入 import pandas as pdSeries 键值对列表 # 创建Series s1 pd.Series([5, 17, 3, 26, 31]) s10 5 1 17 2 3 3 26 4 31 dt…...

MATLAB-基于高斯过程回归GPR的数据回归预测
目录 目录 1 介绍 1. 1 高斯过程的基本概念 1.2 核函数(协方差函数) 1.3 GPR 的优点 1.4. GPR 的局限 2 运行结果 3 核心代码 1 介绍 高斯过程回归(Gaussian Process Regression, GPR)是一种强大的非参数贝叶斯方法&…...

欧洲国际眼科盛会,中国眼科专家周进斩获六项屈光大奖
2024年第42届欧洲白内障和屈光外科医生协会(ESCRS)大会由世界青光眼协会(WGA)、欧洲白内障和屈光外科医生协会(ESCRS)主办,于2024年9月6日至10日在西班牙巴塞罗那举行。 这场眼科盛会,汇聚了来自全球130多个国家的上万名眼科医学领域的顶尖专家、学者和临…...
MySQL——数据库的高级操作(二)用户管理(2)创建普通用户
在创建新用户之前,可以通过 SELECT 语句查看 mysql.user 表中有哪些用户,查询结果如下: mysql> USE mysql; Database changed mysql> SELECT Host, User, authentication_string FROM mysql.user; ----------------------------------…...

VIT论文阅读
把图片看成一个个16x16的patch堆起来的 摘要 卷积神经网络不是必备的,一个纯transformer表现也是非常好的 transformer?2500天tpu v3 介绍 大规模上预训练,小规模任务数据集上微调。扩大模型时候还没观察到瓶颈(还没出现过拟合…...

Python编程入门必备:def关键字与函数参数
在Python编程中,函数是组织代码、实现代码复用和模块化的基础单元。通过函数,可以将复杂的操作封装成独立的代码块,提高代码的可读性和维护性。本文将详细介绍Python中函数的定义和使用,包括def关键字、函数参数的各种类型以及函数…...

LiveKit的agent介绍
概念 LiveKit核心概念: Room(房间)Participant(参会人)Track(信息流追踪) Agent 架构图 订阅信息流 agent交互流程 客户端操作 加入房间 房间创建方式 手动 赋予用户创建房间的…...
青龙面板 升级 及其 依赖更新修复 检测and日志删除等
青龙版本升级 先关闭服务 cd qinglong目录 docker-compose down 关闭 docker pull whyour/qinglong:版本号 //版本号自行选择,如果是为了修复错误,建议版本微升,不然就直接latest 启动 docker-compose up -d 进入容器࿰…...
坐牢第三十七天(Qt)
作业: 使用qt做一个闹钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPixmap> #include <QBitmap> #include <QLabel> //标签类 #include <QLineEdit> //行编辑器类 #include <QPushBu…...

Vidu 全球首发「主体参照」新功能,一键同步角色特征;GPT-4o 实时音频项目负责人离职创业丨 RTE 开发者日报
开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…...

电子地图的主要功能与应用
电子地图,即数字地图,是利用计算机技术,以数字方式存储和查阅的地图。它不仅继承了传统纸质地图的基本功能,还通过现代科技手段实现了诸多创新应用。以下是电子地图的主要功能与应用: 一、主要功能 快速存取与显示&…...

基于Java+SpringBoot+Vue+MySQL的西安旅游管理系统网站
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的西安旅游管理系统网站【附源码文档】、…...
简单介绍 NVIDIA推出的图形处理单元(GPU)架构“安培架构“
概念 "安培架构"(Ampere Architecture)是 NVIDIA 推出的一款图形处理单元(GPU)架构,它是继图灵架构之后的下一代产品。安培架构最初在2020年发布,以其高性能和高效率而闻名,广泛应用…...
Qiskit:量子计算的Python工具包
Qiskit是由IBM开发的开源量子计算软件开发工具包,它提供了一套完整的工具,用于量子电路的设计、模拟、优化和执行。Qiskit支持量子算法的开发,并且可以与IBM的量子计算机硬件进行交互。 Qiskit的主要特点 量子电路设计:Qiskit允…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...