当前位置: 首页 > news >正文

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收集器是基于标记-清除算法实现的,它的运作过程相对于前面几种收集器来说要更复杂一些,整个过程分为四个步骤,包括:

  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收集器具体的实现逻辑。

相关文章:

JVM面试(六)垃圾收集器

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

固态硬盘装系统有必要分区吗?

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

网络安全架构师

网络安全架构师负责构建全面的安全框架,以保护组织的数字资产免受侵害,确保组织在数字化转型的同时维持强大的安全防护。 摩根大通的网络安全运营副总裁兼安全架构总监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 进入容器&#xff0…...

坐牢第三十七天(Qt)

作业&#xff1a; 使用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 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…...

电子地图的主要功能与应用

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

基于Java+SpringBoot+Vue+MySQL的西安旅游管理系统网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的西安旅游管理系统网站【附源码文档】、…...

简单介绍 NVIDIA推出的图形处理单元(GPU)架构“安培架构“

概念 "安培架构"&#xff08;Ampere Architecture&#xff09;是 NVIDIA 推出的一款图形处理单元&#xff08;GPU&#xff09;架构&#xff0c;它是继图灵架构之后的下一代产品。安培架构最初在2020年发布&#xff0c;以其高性能和高效率而闻名&#xff0c;广泛应用…...

Qiskit:量子计算的Python工具包

Qiskit是由IBM开发的开源量子计算软件开发工具包&#xff0c;它提供了一套完整的工具&#xff0c;用于量子电路的设计、模拟、优化和执行。Qiskit支持量子算法的开发&#xff0c;并且可以与IBM的量子计算机硬件进行交互。 Qiskit的主要特点 量子电路设计&#xff1a;Qiskit允…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...