JDK 17 和 JDK 21 在垃圾回收器(GC)上有什么优化?如何调整 GC 算法以提升应用性能?
JDK 17 和 JDK 21 在垃圾回收器(GC)上有什么优化?如何调整 GC 算法以提升应用性能?
本文将从 JDK 17 与 JDK 21 的垃圾回收改进出发,结合代码示例解析优化方案,并提供实际项目中的调优策略,帮助你提升应用性能。
正文
一、JDK 17 与 JDK 21 的垃圾回收优化点
-
JDK 17 的垃圾回收改进
ZGC 进一步优化:
支持更大的堆内存(高达 16TB)。
极低的暂停时间(通常低于 10ms)。
G1 的吞吐量提升:
优化区域(Region)选择算法,提高多线程并发效率。 -
JDK 21 的垃圾回收改进
Shenandoah 的性能增强:
增加并发压缩阶段,减少内存碎片。
支持更多并发线程的动态调节。
G1 增强:
改进分区回收算法,减少停顿时间。
提供更高效的混合回收(Mixed GC)。
二、垃圾回收器的选择与调整
JDK 17 与 JDK 21 提供了多个垃圾回收器,可以根据应用需求调整: -
G1(Garbage-First GC)
适用场景
大型内存应用(堆内存 > 4GB)。
在线系统或对延迟有一定容忍度的应用。
调优参数
代码语言:javascript
复制
-XX:+UseG1GC # 启用 G1 GC
-XX:MaxGCPauseMillis=<时间> # 设置最大暂停时间
-XX:InitiatingHeapOccupancyPercent=<百分比> # 设置启动回收的堆占用百分比
代码示例:调优 G1
代码语言:javascript
复制
public class G1GCDemo {
public static void main(String[] args) {
System.out.println(“G1 GC 调优示例”);
for (int i = 0; i < 1_000_000; i++) {
byte[] data = new byte[1024 * 1024]; // 模拟分配大对象
}
System.out.println(“示例结束”);
}
}
启动参数:
代码语言:javascript
复制
java -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=45 G1GCDemo
2. ZGC(Z Garbage Collector)
适用场景
超大内存应用(堆内存 > 16TB)。
延迟敏感型系统,如实时数据处理和金融应用。
调优参数
代码语言:javascript
复制
-XX:+UseZGC # 启用 ZGC
-Xms # 设置堆初始大小
-Xmx # 设置堆最大大小
-XX:SoftMaxHeapSize=<大小> # 设置软最大堆大小
代码示例:调优 ZGC
代码语言:javascript
复制
public class ZGCDemo {
public static void main(String[] args) {
System.out.println(“ZGC 调优示例”);
for (int i = 0; i < 1_000_000; i++) {
byte[] data = new byte[1024 * 1024]; // 模拟分配大对象
}
System.out.println(“示例结束”);
}
}
启动参数:
代码语言:javascript
复制
java -XX:+UseZGC -Xmx16G -XX:SoftMaxHeapSize=8G ZGCDemo
3. Shenandoah
适用场景
中大型内存应用(1GB~10TB)。
低延迟、高吞吐并重的应用场景。
调优参数
代码语言:javascript
复制
-XX:+UseShenandoahGC # 启用 Shenandoah GC
-XX:ShenandoahGCHeuristics=<策略> # 设置启发式策略(如 compact、static 等)
代码示例:调优 Shenandoah
代码语言:javascript
复制
public class ShenandoahGCDemo {
public static void main(String[] args) {
System.out.println(“Shenandoah 调优示例”);
for (int i = 0; i < 1_000_000; i++) {
byte[] data = new byte[1024 * 1024]; // 模拟分配大对象
}
System.out.println(“示例结束”);
}
}
启动参数:
代码语言:javascript
复制
java -XX:+UseShenandoahGC -XX:ShenandoahGCHeuristics=compact ShenandoahGCDemo
三、GC 调优的常用工具
- GC 日志
通过启用 GC 日志,可以分析垃圾回收的详细行为。
启动参数:
代码语言:javascript
复制
-Xlog:gc* # 启用 GC 日志
-Xlog:gc*:file=gc.log:time,uptime,level,tags # 输出到文件
2. JVisualVM
实时监控应用的堆内存使用和垃圾回收行为。
使用步骤
启动应用,添加 -Dcom.sun.management.jmxremote 参数。
打开 JVisualVM,连接目标应用。
观察内存和 GC 的运行情况。
四、垃圾回收器的性能对比
特性
G1
ZGC
Shenandoah
暂停时间
可控(用户设置目标)
极低(10ms 以下)
较低(10ms~100ms)
吞吐量
较高
较高
高
并发回收
部分并发
几乎全并发
大部分并发
内存支持
4GB~16TB
超大内存(16TB)
1GB~10TB
五、GC 调优常见问题 Q&A
Q1:如何减少 GC 对应用性能的影响?
调整堆大小(-Xms 和 -Xmx),确保有足够的内存分配空间。
使用并发 GC(如 G1、ZGC 或 Shenandoah),减少全停顿。
Q2:为什么 ZGC 的暂停时间如此低?
A:ZGC 将大部分垃圾回收工作并发完成,仅有极少部分需要停顿。
Q3:Shenandoah 和 G1 如何选择?
如果需要更低的延迟,选 Shenandoah。
如果吞吐量优先,可选择 G1。
六、总结
JDK 17 与 JDK 21 中 GC 的优化点:
ZGC 的低延迟与超大内存支持。
G1 的吞吐提升与分区回收优化。
Shenandoah 的并发压缩与动态线程支持。
调优建议:
根据应用场景选择合适的 GC:延迟敏感选 ZGC,吞吐优先选 G1,混合负载选 Shenandoah。
启用 GC 日志和监控工具,分析垃圾回收行为并优化内存分配。
相关文章:
JDK 17 和 JDK 21 在垃圾回收器(GC)上有什么优化?如何调整 GC 算法以提升应用性能?
JDK 17 和 JDK 21 在垃圾回收器(GC)上有什么优化?如何调整 GC 算法以提升应用性能? 本文将从 JDK 17 与 JDK 21 的垃圾回收改进出发,结合代码示例解析优化方案,并提供实际项目中的调优策略,帮助…...

CNN-GRU卷积神经网络门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)
代码地址:CNN-GRU卷积神经网络门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据) CNN-GRU卷积神经网络门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景和意义 随着全球能源危机和环境问题的日…...
kotlin中expect和actual关键字修饰的函数作用
在 Kotlin 多平台编程中,expect 和 actual 关键字用于定义跨平台的抽象和具体实现。这种机制允许开发者声明一个平台无关的接口或函数签名(使用 expect),然后在每个目标平台上提供具体的实现(使用 actual)。…...
鸿蒙音视频播放器:libwlmedia
libwlmedia 跨平台播放器wlmedia现在已经支持了鸿蒙(Harmony)平台了,SDK插件地址:libwlmedia 一、接入SDK 1.1 导入SDK ohpm i ywl5320/libwlmedia1.2 添加权限(可选) 如果需要播放网络视频,需要添加网络权限 #m…...

【devops】 Git仓库如何fork一个私有仓库到自己的私有仓库 | git fork 私有仓库
一、场景说明 场景: 比如我们Codeup的私有仓库下载代码 放入我们的Github私有仓库 且保持2个仓库是可以实现fork的状态,即:Github会可以更新到Codeup的最新代码 二、解决方案 1、先从Codeup下载私有仓库代码 下载代码使用 git clone 命令…...

CEF132编译指南 MacOS 篇 - 构建 CEF (六)
1. 引言 经过前面一系列的精心准备,我们已经完成了所有必要的环境配置和源码获取工作。本篇作为 CEF132 编译指南系列的第六篇,将详细介绍如何在 macOS 系统上构建 CEF132。通过配置正确的编译命令和参数,我们将完成 CEF 的构建工作…...
mysql大数据量分页查询
一、什么是MySQL大数据量分页查? MySQL大数据量分页查是指在使用MySQL数据库时,将大量数据分成多个较小的部分进行显示,以提高查询效率和用户体验。分页查询通常用于网页或应用程序中,以便用户能够逐步浏览结果集。 二、为什…...

计算机毕业设计SpringBoot校园二手交易小程序 校园二手交易平台(websocket消息推送+云存储+双端+数据统计)(源码+文档+运行视频+讲解视频)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
尚硅谷爬虫note003
一、函数 1. 函数的定义 def 函数名(): 代码 2.函数的调用 函数名() 3. 定义参数(不调用函数不执行) def sum(a,b) #形参 c a b print(c&…...
【逆向工程】破解unity的安卓apk包
先了解一下普通apk包的逆向方法(无加密或加壳) 开发环境: 操作系统:windows 解apk包 下载工具:apktool【Install Guide | Apktool】按照文档说的操作就行,先安装java运行时环境【我安装的是jre-8u441-wind…...
稠密架构和稀疏架构
稠密架构和稀疏架构 flyfish 稠密架构 参数使用方面:稠密架构中的大部分参数在每次计算时都会被使用。也就是说,对于输入的每一个样本,模型的所有或大部分参数都会参与到计算过程中。计算特点:计算密集,需要对大量的…...

LeetCode --- 436周赛
题目列表 3446. 按对角线进行矩阵排序 3447. 将元素分配给有约束条件的组 3448. 统计可以被最后一个数位整除的子字符串数目 3449. 最大化游戏分数的最小值 一、按对角线进行矩阵排序 直接模拟,遍历每一个斜对角线,获取斜对角线上的数字,排…...
用easyExcel如何实现?
要使提供的 ExcelModelListener 类来解析 Excel 文件并实现批量存储数据库的功能,需要结合 EasyExcel 库来读取 Excel 数据。具体来说,可以使用 EasyExcel.read() 方法来读取 Excel 文件,并指定 ExcelModelListener 作为事件监听器。 下面是…...

从 X86 到 ARM :工控机迁移中的核心问题剖析
在工业控制领域,技术的不断演进促使着工控机从 X86 架构向 ARM 架构迁移。然而,这一过程并非一帆风顺,面临着诸多关键挑战。 首先,软件兼容性是一个重要问题。许多基于 X86 架构开发的工业控制软件可能无法直接在 ARM 架构上运行…...
大模型DeepSeek-R1学习
学习路线 机器学习-> 深度学习-> 强化学习-> 深度强化学习 大模型演进分支 微调: SFT 监督学习蒸馏:把大模型作为导师训练小模型RLHF:基于人类反馈的强化学习 PPO 近端策略优化 油门 - 重要性采样 权重 * 打分刹车 - clip 修剪…...

【STM32】H743的以太网MAC控制器的一个特殊功能
调试743的MAC,翻阅手册的时候,发现了一个有意思的功能 混杂模式 H743的MAC控制器,可以设置为混杂模式,这就意味着它可以做一些网络监控的应用,譬如连接具备端口镜像功能的交换机,然后直接代替PC实现网络数据…...
关于“i18n“在vue中的使用
关于"i18n"在vue中的使用 <!-- vue2中 --> <template><div>{{ $t("This campaign has expired.") }}}}</div> </template> <script> export default {created() {this.onLoading();},methods: {onLoading () {this.$…...

前缀树算法篇:前缀信息的巧妙获取
前缀树算法篇:前缀信息的巧妙获取 那么前缀树算法是一个非常常用的算法,那么在介绍我们前缀树具体的原理以及实现上,我们先来说一下我们前缀树所应用的一个场景,那么在一个字符串的数据集合当中,那么我们查询我们某个字…...

DVSI使用SenseGlove为开发虚拟现实场景技能培训
虚拟现实场景技能培训能够有效提升被培训者的技能熟练度,使其在现实世界中经历类似事件时第一时间做出正确反映,从而大大降低因缺乏相关技能经验所造成的财产、人员、时间损失。 DVSI(Digital Voice Systems Inc)是一家美国数字化…...

VSCode + Continue 实现AI编程助理
安装VS Code 直接官网下载安装,反正是免费的。 安装VS插件Continue 直接在插件市场中搜索, Continue,第一个就是了。 配置Chat Model 点击Add Chat model后进行选择: 选择Ollama后,需要点击下面的config file : 由于…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

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…...