HotSpot经典垃圾收集器

news2024/10/7 12:23:03

虽然垃圾收集器的技术在不断进步,但直到现在还没最好的收集器出现,更加不存在“万能”的收集器,所以我们选择的只是对具体应用最合适的收集器。

图 HotSpot中的垃圾收集器,连线表示可搭配使用

1 Serial收集器

是最基础、历史最悠久的收集器。是一个单线程工作的收集器,在进行垃圾收集时,必须暂停其他所有线程,而且只会使用一个处理器或一条收集线程去完成垃圾收集工作。

迄今为止,仍是HotSpot虚拟机运行在客户端模式下的默认新生代收集器。

1.1 优势

简单而高效(与其他收集器的单线程相比)。

对于内存资源受限的环境,它是所有收集器里额外内存消耗最小的;

对于单核处理器或处理器核心数比较少的环境来说,其可以获得最高的单线程收集效率。

1.2 应用场景

用户桌面以及部份微服务应用中。对于运行在客户端模式下的虚拟机来说是一个很好的选择。

1.3 Serial Old 收集器

是Serial收集器的老年代版本,单线程收集器,使用标记-整理算法。

2 ParNew收集器

实质上是Serial收集器的多线程并行版本(工作时需暂停所有用户线程)。除了同时使用多条线程进行垃圾收集之外,其余行为等与Serial一致,在实现上两种收集器也共用了相当多的代码。

是除Serial收集器外,目前唯一能CMS收集器配合工作的收集器。

3 Parallel Scavenge收集器

同样基于标记-复制算法实现的多线程收集器。

特点是它的关注点与其他收集器不同。其他收集器关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。

3.1 吞肚量

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

3.1.1 参数控制吞吐量

-XX:MaxGCPauseMillis:最大垃圾收集器停顿时间。收集器将尽力保证内存回收花费的时间不超过用户设定值。垃圾收集停顿时间缩短是以牺牲吞吐量和新生代空间为代价换取的(停顿时间缩短,会直接导致垃圾收集发生更频繁)。

-XX:GCTimeRatio:吞吐量大小(0,100)。如果设置为N,则用户代码执行时间 : 总执行时间 = N : N+1。

3.2 Parallel Old收集器

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

4 CMS收集器

是一种以获取最短回收停顿时间为目标的收集器。基于标记-清除算法实现。

4.1 运作过程

分为四个步骤:1)初始标记;2)并发标记;3)重新标记;4)并发清除。

初始标记和重新标记仍然需要“Stop The Word(STW)”初始标记是单线程,其他步骤是多线程。

初始标记

仅仅只是标记一下GC Roots能直接关联的对象,速度很快。

并发标记

开始遍历整个对象图,耗时长,但不需要停顿用户线程

重新标记

为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部份对象的标记记录。

并发清除

清理删除掉标记阶段判断的已经死亡的对象

表 CMS运作各个过程的内容

4.2 缺陷

1)对处理器资源非常敏感

事实上面向并发设计的程序都对处理器资源比较敏感。CMS默认启动的回收线程数是(处理器核心数量+3)/ 4。

2)无法处理浮动垃圾

在CMS并发标记和并发清理阶段,用户线程还在继续运行,会伴随有新的垃圾对象不断产生,但这一部分垃圾对象是出现在标记过程结束以后,CMS无法在当次收集中处理掉它们,只好留待下一次垃圾收集时再清理掉。这一部份垃圾就称为浮动垃圾。

3)空间碎片

“标记-清除”算法引起的。

5 Garbage First收集器(G1)

是垃圾收集器技术发展历史上的里程碑式的成功,开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。

主要面向服务端应用。设计者们希望做出一款能建立起“停顿时间模型”的收集器。

5.1 基于Region的堆内存布局

把连续的java堆划分为多个大小相等的独立区域(Region),每个Region都可以根据需要,每个Region都可以根据需要扮演新生代的Eden空间、Survivor空间或者老年代空间。

收集器能够对扮演不同角色的Region采取不同的策略去处理,无论是新建对象还是已存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。

图 堆空间的Region布局

Region的大小为2的N次幂。

5.1.1 Humongous区域

超过Region容量一半的对象即可判定为大对象。对于那些超过了整个Region容量的超级大对象,将会被存放在N个连续的Humongous Region之中。

G1的大多数行为都把Humongous Region作为老年代的一部分来进行看待。

5.1.2 停顿时间模型(Pause Prediction Model)

能支持指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间大概率不超过N毫秒的目标。

G1可以面向堆内存任何部份来组成回收集(Collection Set,一般简称CSet)进行回收,衡量标准不再是它属于哪个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大。这就是G1的Mixed Gc模式。

图 G1垃圾收集过程

5.2 实现细节

5.2.1 跨Region引用

Region同样也是使用记忆集避免全堆扫描。但是其的记忆集要复杂很多,每个Region都有维护自己的记忆集。这些记忆集会记录下别的Region指向自己的指针,并标记这些指针分别在哪些卡页的范围内。

图G1的记忆集

G1记忆集在存储结构本质是一种哈希表。key是别的Region的起始地址,value存储了卡表的索引号。

每个Region又被分成了若干个大小为512字节的Card,Card中的每个元素对应其标识的内存区域中一块特殊大小的内存块(卡页),加入G1默认的Region大小是2M,则Region对应的Card的每个元素的卡页大小为2M/512=4k。

5.2.2 并发标记阶段保证线程与用户线程互不干扰

通过原始快照(SATB)算法来实现。

5.2.3 建立可靠的停顿预测模型

以衰减均值为理论基础来实现。

G1收集器会记录每个Region的回收耗时、每个Region记忆集里的脏卡数量等各个可测量的步骤花费的成本,并分析得出平均值、标准偏差、置信度等统计信息。

“衰减平均值”是指它会比普通平均值更容易受到新数据等影响。

5.3 G1收集器的运作过程

初始标记

仅仅只是标记一下GC Roots能直接关联到的对象,并且修改TAMS(Region的指针)的值,让下阶段用户线程并发运行时,能正确地在可用的Region中分配新的对象。

并发标记

从GC Roots开始对堆中堆对象进行可达性分析,此过程与用户线程并发执行,耗时较长。

最终标记

对用户线程做一个短暂的暂停。用于处理并发阶段结束后仍遗留下来的SATB记录。

筛选回收

负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划。基于复制-清理的算法。 需要暂停用户线程。多条收集器线程并行完成。

表 G1收集器的运作过程

从G1开始,最先进的垃圾收集器的设计向导都不约而同地变为追求能够应付应用的内存分配速率,而不追求一次把整个Java堆全部清理干净。

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

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

相关文章

第08章_面向对象编程(高级)

第08章_面向对象编程(高级) 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 关键字:static 回顾类中的实例变量(即非static的成员变量) c…

linux文件类型和根目录结构

目录 一、Linux文件类型 二、Linux系统的目录结构 1. FHS 2. 路径以及工作目录 (1)路径 (2)工作目录 一、Linux文件类型 使用ls -l命令查看到的第一个字符文件类型说明-普通文件类似于Windows的记事本d目录文件类似于Windo…

【GPT4】GPT4 创作郭德纲姜昆相声作品的比较研究

欢迎关注【youcans的 AIGC 学习笔记】原创作品 说明:本文附录内容由 youcans 与 GPT-4 共同创作。 【GPT4】GPT4 创作郭德纲姜昆相声作品的比较研究研究总结0. 背景1. 对 GPT4 创作的第 1 段相声的分析2. 对GPT4 创作的第 2 段相声的分析3. 对GPT4 创作的第 3 段相…

Window常用命令

一、快捷键 1、自带快捷键 序号快捷键作用1windowsGXBOX录屏2cmd >osk屏幕键盘3cmd >calc计算器4cmd >mrt恶意软件删除工具 2、浏览器快捷键 序号快捷键作用1Alt P浏览器图片下载(来自油猴脚本) 二、其他功能 1、解决端口占用 第一步&…

Linux安装单细胞分析软件copykat

Linux安装单细胞分析软件copykat 测试环境 Linux centos 7R 4.1.2minconda3天意云24C192GB安装步骤 新建环境 conda activate copykatconda install r-base4.1.2 安装基础软件 checkPkg <- function(pkg){return(requireNamespace(pkg, quietly TRUE))}if(!checkPkg("…

类的加载过程-过程二:Linking阶段

链接过程之验证阶段(Verification) 当类加载到系统后&#xff0c;就开始链接操作&#xff0c;验证是链接操作的第一步。 它的目的是保证加载的字节码是合法、合理并符合规范的。 验证的步骤比较复杂&#xff0c;实际要验证的项目也很繁多&#xff0c;大体上Java虚拟机需要做…

基于stable diffusion的艺术操作

下面是作者基于stable diffusion的艺术操作 得益于人工智能的强大技术 以下所有的图 绝对是整体星球上唯一的图 现在人工智能越来越强大&#xff0c;感觉将来最有可能取代的就是摄影师、中低级的程序员、UI设计师、数据分析师等&#xff0c;人们未来更多从事的职业应该是快速…

机器学习 01

目录 一、机器学习 二、机器学习工作流程 2.1 获取数据 2.2 数据集 2.2.1 数据类型构成 2.2.2 数据分割 2.3 数据基本处理 2.4 特征工程 2.4.1什么是特征工程 2.4.2 为什么需要特征工程(Feature Engineering) 2.4.3 特征工程内容 2.5 机器学习 2.6 模型评估 2.7 …

【消息队列】细说Kafka消费者的分区分配和重平衡

消费方式 我们直到在性能设计中异步模式&#xff0c;一般要么是采用pull&#xff0c;要么采用push。而两种方式各有优缺点。 pull &#xff1a;说白了就是通过消费端进行主动拉去数据&#xff0c;会根据自身系统处理能力去获取消息&#xff0c;上有Broker系统无需关注消费端的…

Windows GPU版本的深度学习环境安装

本文记录了cuda、cuDNN的安装配置。 参考文章&#xff1a; cuda-installation-guide-microsoft-windows 12.1 documentation Installation Guide :: NVIDIA cuDNN Documentation 一、cuda安装 注意事项&#xff1a; 1、cuda安装最重要的是查看自己应该安装的版本。 表格…

Java数组打印的几种方式

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

独立看门狗(IWDG)实验

独立看门狗简介 单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环&#xff0c; 看门狗电路就是为了避免这种情况的发生 。IWDG&#xff08;Independent watchdog&#xff09;独立看门狗&#xff0c;可以用来检测并解决由于软件错误导致的故障&#xff0c;当计数器…

使用 ArcGIS Pro 进行土地利用分类的机器学习和深度学习

随着技术进步&#xff0c;尤其是地理信息系统 (GIS)工具的进步&#xff0c;可以更有效地对土地利用进行分类。分类的使用可用于识别植被覆盖变化、非法采矿区和植被抑制区域&#xff0c;这些只是土地利用分类的众多示例中的一部分。 分类的一大困难是确定要解决的问题的级别。…

MongoDB 聚合管道中使用数组表达式运算符断言数组($isArray)

数组表达式运算符主要用于文档中数组的操作&#xff0c;接上一篇&#xff1a; MongoDB 聚合管道中使用数组表达式运算符&#xff08;$concatArrays合并数组&#xff09;https://blog.csdn.net/m1729339749/article/details/130162048本篇我们主要介绍数组表达式运算符中用于断…

在windows上安装部署cicd

安装步骤 下载gitlab-runner&#xff0c;官网地址如下&#xff1a; https://docs.gitlab.com/runner/install/windows.html在任意位置创建文件夹&#xff0c;并把安装程序放入文件夹中 安装gitlab-runner 注意需要使用管理员权限&#xff0c;打开powershell才能运行 cd C:\Gi…

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用主要贡献与相关工作比较的贡献三、系统模型&#xff08;only 2 pages&#xff09;3.1 网络模型3.2 通信模型3.3 计算模型3.3.1 本地计算3.3.2 卸载计算四、预备知识&#xff08;only 1 page&#xff09;五…

Autosar COM Stack系列介绍01_一文看懂各层PDU

本文框架1. 概述1.1 缩写2. OSI模型在Autosar中应用3. 各层PDU介绍3.1 L-PDU3.2 N-PDU3.2.1 N_AI3.2.2 N_PCI3.3 I-PDU1. 概述 在学习Autosar通信栈时中会遇到关于PDU的各种缩写&#xff0c;例如&#xff0c;L-PDU&#xff0c;N-PDU&#xff0c;I-PDU还有SDU等&#xff0c;它们…

Kafka3.0.0版本——生产者自定义分区器

目录一、生产者自定义分区器代码示例1.1、自定义分区器类1.2、生产者发送消息代码&#xff08;生产者的配置中添加分区器参数&#xff09;1.3、测试一、生产者自定义分区器代码示例 1.1、自定义分区器类 代码 package com.xz.kafka.producer;import org.apache.kafka.clients.…

Web API学习笔记1(DOM学习)

一、API 和 web API 1API API —— 应用程序编程接口&#xff0c;是给程序员提供的一种工具&#xff0c;以便能更轻松的实现想要完成的功能。可以比作为充电接口 2.Web API 是浏览器提供的一套操作浏览器功能和页面元素的API&#xff08;BOM和DOM&#xff09;&#xff0c;主…

HarmonyOS/OpenHarmony应用开发-ArkTS画布组件CanvasRenderingContext2D对象(十一)

measureText measureText(text: string): TextMetrics 该方法返回一个文本测算的对象&#xff0c;通过该对象可以获取指定文本的宽度值。 示例&#xff1a; // xxx.etsEntryComponentstruct MeasureText { private settings: RenderingContextSettings new RenderingConte…