oraclejdk相比较于openjdk,在G1,ZGC,ShenandoahGC垃圾回收器做了哪些具体的优化,此文一篇讲清楚

前言

了解 Oracle JDK 在 G1、ZGC 和 Shenandoah 垃圾回收器(GC)方面的具体优化需要深入了解每个垃圾回收器的内部工作原理及 Oracle 在其基础上所做的具体改进。以下是对 G1、ZGC 和 Shenandoah 垃圾回收器的详细优化分析,包括具体的技术实现和改进措施。

G1 (Garbage-First) 垃圾回收器

G1 是一个旨在替代 CMS 的低停顿垃圾回收器。它通过分区回收和预测模型来优化暂停时间。

Oracle JDK 对 G1 的具体优化
暂停预测模型优化
统计回归模型:Oracle 通过增强暂停预测模型的统计回归算法,使其更精确地预测每个垃圾回收周期的暂停时间。这包括使用历史数据来调整回归参数,以更好地反映实际应用负载和内存使用模式。
自适应算法:引入自适应预测算法,根据运行时的实际暂停时间动态调整预测模型。这种方法允许 G1 更加灵活地应对不同的工作负载,从而减少预测误差。
混合收集(Mixed Collection)策略调整
启发式算法:Oracle 增强了混合收集阶段的启发式算法,使其在选择要回收的分区时更加智能。通过分析分区的活跃度和回收收益,优化选择最适合回收的分区,从而平衡吞吐量和暂停时间。
动态调整策略:根据当前系统的负载情况动态调整混合收集策略。例如,在高负载情况下减少老年代分区的回收频率,以减少长时间暂停。
并发标记优化
多线程标记:优化并发标记阶段的多线程实现,通过更高效的线程同步和负载均衡,减少标记过程中线程间的竞争,提高标记效率。
增量标记:引入增量标记技术,将标记过程分为多个小阶段,避免长时间的单次标记,从而减少对应用线程的影响。
字符串去重(String Deduplication)优化
改进的哈希算法:优化字符串去重过程中使用的哈希算法,提高字符串比较的速度和准确性,减少重复字符串的内存占用。
并发去重:改进去重过程的并发执行方式,使其能够在不影响应用性能的情况下高效地去重字符串。
分区管理优化
分区选择算法:优化分区选择算法,使 G1 在选择要回收的分区时能够更好地考虑内存碎片情况和分区的使用效率,减少内存碎片的生成。
分区合并策略:引入分区合并策略,当发现大量小分区时,G1 会尝试将这些分区合并,以提高内存利用效率。

ZGC (Z Garbage Collector)

ZGC 是一个低停顿垃圾回收器,使用染色指针和并发压缩技术来实现低延迟。

Oracle JDK 对 ZGC 的具体优化
染色指针管理优化
内存屏障优化:优化染色指针使用的内存屏障技术,使得染色指针在管理对象引用时对应用线程的影响最小化。例如,通过减少屏障的开销和优化屏障触发条件,提高整体性能。
染色指针编码:优化染色指针的编码方式,使其能够更高效地存储和解析对象引用信息,减少解析过程中的性能开销。
并发标记和压缩优化
改进的并发标记算法:优化并发标记阶段的算法,提高标记的精度和效率。例如,通过引入更高效的标记位图结构和优化标记路径,减少标记阶段的停顿时间。
压缩算法改进:对并发压缩算法进行优化,使其能够更高效地整理和压缩内存。包括引入分区压缩技术,将压缩过程分为多个小步骤,减少单次压缩的停顿时间。
NUMA 友好性优化
内存分配策略:优化 ZGC 在 NUMA 系统上的内存分配策略,使其能够更好地利用 NUMA 节点的局部性,减少跨节点内存访问延迟。例如,通过优先在本地节点分配内存,优化线程和内存的亲和性。
堆管理优化
动态堆调整:引入动态堆调整策略,根据应用的内存使用情况动态调整堆的大小和布局,以提高内存利用效率和垃圾回收性能。
分区管理优化:改进分区管理算法,使 ZGC 能够更高效地管理大规模堆内存,减少分区碎片和管理开销。
垃圾回收线程调度优化
线程优先级调整:优化垃圾回收线程的优先级调度,使其在不影响应用性能的前提下最大化垃圾回收效率。例如,在系统负载较低时提高回收线程的优先级,加快垃圾回收速度。

Shenandoah 垃圾回收器

Shenandoah 是一个低延迟垃圾回收器,采用并发压缩技术来减少停顿时间。

Oracle JDK 对 Shenandoah 的具体优化
并发压缩优化
增量压缩:引入增量压缩技术,将大规模压缩过程分为多个小步骤执行,减少单次压缩的停顿时间,提高整体压缩效率。
压缩策略优化:改进压缩策略,使其能够更好地适应不同的内存使用模式,动态调整压缩参数,以达到最佳性能。
细粒度锁优化
锁分离技术:优化细粒度锁的实现,通过锁分离技术减少锁竞争,提高并发性能。例如,将全局锁拆分为多个局部锁,使多个线程能够并行执行垃圾回收任务。
自适应锁策略:引入自适应锁策略,根据运行时的实际负载动态调整锁的策略,以减少锁争用和等待时间。
自适应调整策略
动态参数调整:引入自适应调整策略,根据应用的运行时表现动态调整垃圾回收参数,如垃圾回收频率、压缩策略等,以达到最佳性能和平衡。
负载感知优化:根据系统负载情况动态调整垃圾回收策略,使 Shenandoah 能够在不同负载下均保持高效的垃圾回收性能。
内存访问优化
并发访问优化:优化并发内存访问路径,使 Shenandoah 在进行垃圾回收时对应用线程的影响最小化。例如,通过优化内存屏障和访问控制,减少内存访问开销。
对象布局优化:优化对象在内存中的布局,使内存访问更加高效,减少垃圾回收过程中对象移动和整理的成本。
内存屏障优化
屏障合并:优化内存屏障的实现,通过屏障合并技术减少垃圾回收过程中屏障操作的次数,提高整体性能。
屏障触发条件优化:优化内存屏障的触发条件,使其在最需要的时候触发,减少不必要的屏障开销。

总结

Oracle 在 G1、ZGC 和 Shenandoah 垃圾回收器上进行了大量具体的优化,这些优化不仅涉及算法和数据结构的改进,还包括对并发执行、内存管理和系统适配的深度优化。这些具体的技术实现和改进措施,使得 Oracle JDK 在垃圾回收性能和稳定性上明显优于 OpenJDK,特别是在高并发、大内存应用环境中表现尤为突出。理解这些优化细节,对于开发和运维人员选择和调优垃圾回收器具有重要参考价值。

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

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

相关文章

Apache trino的ldap认证开启

作者:櫰木 1、背景 由于trino 默认没有开启用户认证体系,需要ldap用户进行认证。开启tls和ldap用户认证,提高安全性。 2、配置 前置条件。 trino 集群已经部署完成 ldap 服务 openjdk 版本大于11.0.17 生成证书 keytool -genkeypair…

【动态规划1】斐波那契数列模型篇

文章目录 声明动态规划介绍1137.第N个泰波那契数题目描述分析代码 面试题 08.01. 三步问题题目描述分析代码 746.使用最小花费爬楼梯题目描述分析代码 91.解码⽅法题目描述分析代码 声明 本篇博客为动态规的基础篇,从零开始学习动态规划,如有错误&#…

AGI 之 【Hugging Face】 的【问答系统】的 [评估并改进问答Pipeline] / [ 生成式问答 ] 的简单整理

AGI 之 【Hugging Face】 的【问答系统】的 [评估并改进问答Pipeline] / [ 生成式问答 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【问答系统】的 [评估并改进问答Pipeline] / [ 生成式问答 ] 的简单整理 一、简单介绍 二、构建问答系统 三、评估并改进问答pipeline 1…

[k8s源码]4.informer

Informer 是 client-go 库中的一个核心组件,它提供了一种高效的方式来监视 Kubernetes 集群中资源的变化。Informer 通过 Watch 机制与 API Server 建立长连接,初次同步时会获取资源的完整列表,之后只接收增量更新,大大减少了网络流量。 使用informer可…

Java常用排序算法

算法复杂度 详解Java常用排序算法(10种,含演示动画) 冒泡排序(Bubble Sort) arr[0] 与 arr[1]比较,如果前面元素大就交换,如果后边元素大就不交换。然后依次arr[1]与arr[2]比较,第…

可视化工具选择指南:助力企业数字化转型和新质生产力发展

随着信息技术的快速发展和新质生产力概念的兴起,可视化工具在各个行业中的作用日益凸显。这些工具不仅能够帮助用户更直观地理解和分析数据,还能提升团队的协作效率和决策质量。 在当今数字化转型迅速发展的背景下,新质生产力的概念正在成为…

SpringBoot使用开发环境的application.properties

在Spring Boot项目中,application.properties 或 application.yml 文件是用于配置应用程序外部属性的重要文件。这些文件允许定制你的应用,而无需更改代码。根据不同的运行环境,可以通过创建以application-{profile}.properties格式命名的文件…

python-区间内的真素数(赛氪OJ)

[题目描述] 找出正整数 M 和 N 之间(N 不小于 M)的所有真素数。真素数的定义:如果一个正整数 P 为素数,且其反序也为素数,那么 P 就为真素数。 例如,11,13 均为真素数,因为 11 的反序…

利用Amazon Rekognition Face Liveness进行人脸活体检测的实践与探索

在人工智能、机器学习技术日渐普及的当下,出海企业都希望能够加快利用人工智能、机器学习技术,从而打造智能产品及其增值服务、为各地区提供本地化和个性化的服务体验及实现自身业务流程智能化。九河云将介绍人脸活体检测解决方案,亚马逊云科…

录频软件大盘点,哪款是你的最爱?

随着网络技术的飞速发展,人们对于录频软件的需求越来越强烈。无论是教育工作者、学生、游戏玩家还是商务人士,一款合适的录频软件都可以为他们提供便利。本文将介绍3款主流的录频软件,以帮助用户了解它们的特点、功能以及操作方法。 录频软件…

c#中的事件

在C#中,事件(Events)是一种使类或对象能够提供通知的机制。当某个重要事情发生时(比如用户点击了一个按钮、数据发生变化等),事件的发布者(通常是一个类)会通知事件的所有订阅者&…

在Centos上安装MySQL

目录 在Centos上安装MySQL1.确认当前的系统版本2.添加 MySQL Yum 源2.1访问MySQL开发者专区2.2根据当前系统选择对应的发布包2.3补充 3.MySQL的历史发行版本4.安装发布包5.安装MySQL5.1启动MySQL服务器5.2查看服务器状态5.3开机自启动5.4 登入MySQL5.5修改密码 在Centos上安装M…

Spring Data Redis + Redis数据缓存学习笔记

文章目录 1 Redis 入门1.1 简介1.2 Redis服务启动与停止(Windows)1.2.1 服务启动命令1.2.2 客户端连接命令1.2.3 修改Redis配置文件1.2.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常用数据类型介绍 3. Redis常用命令3.1 字符串操作命令3.2 哈希操作…

Docker-Nvidia(NVIDIA Container Toolkit)

安装NVIDIA Container Toolkit工具,支持docker使用GPU 目录 1.NVIDIA Container Toolkit 安装1.1 nvidia-docker安装1.2 验证1.2.1 验证安装1.2.2 额外补充 1.NVIDIA Container Toolkit 安装 1.1 nvidia-docker安装 NVIDIA/nvidia-docker Installing the NVIDIA …

MySQL 关键字 IN 与 EXISTS 的使用与区别

目录 1. IN & NOT IN1.1 基本使用1.2 工作原理1.2.1 静态值列表的 IN 语句1.2.2 子查询的 IN 语句 1.3 相关优化 2. EXISTS & NOT EXISTS2.1 基本使用2.2 工作原理2.3 相关优化 3. 两者区别 1. IN & NOT IN IN:IN用于判断某个字段的值是否存在于给定的…

SQL Server Query Store Settings (查询存储设置)

参考:Query Store Settings - Erin Stellato 在 SQL Server 2017 中,有九 (9) 个设置与查询存储相关。虽然这些设置记录在sys.database_query_store_options中,但我经常被问到每个设置的值“应该”是多少。我在下面列出了每个设置&am…

AI数字人直播源码解析:灰豚私有化部署背后的技术分析

随着AI数字人技术的应用潜力不断显现,与AI数字人相关的多个项目逐渐成为创业者们的重点关注对象,作为当前AI数字人典型应用场景之一的数字人直播意向人数更是屡创新高,AI数字人直播源码部署的热度也因此不断飙升,与各大数字人源码…

Centos7 安装私有 Gitlab

在 CentOS 7上,下面的命令也会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤,如果您打算仅从本地网络访问极狐GitLab,则可以跳过它。 sudo yum install -y curl policycoreutils-python openssh-server perl sudo systemct…

昇思25天学习打卡营第20天|应用实践之RNN实现情感分类

基本介绍 今天的应用实践是RNN实现情感分类,情感分类是自然语言处理中的经典任务,是典型的分类问题。RNN是一种循环神经网络,接收序列数据作为输入。模型训练所采用的数据集是IMDB影评数据集,数据集包含Positive和Negative两类。由…

Weird LCM Operations

我们先观察,有 ⌊ n 6 ⌋ \lfloor \frac{n}{6} \rfloor ⌊6n​⌋,我们如果每次操作三个不同的数,也需要 n 3 \frac{n}{3} 3n​次操作,所以我们考虑只操作一半的序列 跟一半有关的东西大概有:奇偶,前一半后…