Java ZGC 算法调优
ZGC 是一种专门的垃圾收集器,专注于管理大型堆并最大限度地减少 Java 应用程序中的暂停。它解决了内存密集型工作负载和一致的响应时间至关重要的场景中垃圾收集的挑战。利用并发处理能力和先进算法,ZGC 为优化 Java 应用程序的性能提供了有效的解决方案。在这篇文章中,我们将探索调整 ZGC 来提高性能的技术。
ZGC 调整参数
ZGC 是 Java 中的垃圾收集器,它采用不同的方法通过最小化公开的 JVM参数的数量来进行调整。与需要细粒度调整的传统垃圾收集器不同,ZGC专注于优化大堆大小的管理,同时以最小的配置开销提供高效的垃圾收集。这种简化的方法使开发人员能够主要关注一个关键的 JVM参数进行调整:堆大小。
1. 堆大小(-Xmx)
“堆大小”参数是 ZGC 的一个重要调整选项。它确定分配给 Java 堆的最大内存量,Java 堆是 Java 应用程序执行期间在内存中存储对象的位置。
配置 ZGC 的堆大小时,需要考虑几个因素。首先,您需要确保堆可以容纳应用程序的活动集,其中包括运行时主动使用的所有对象。分配太小的堆大小可能会导致频繁的垃圾收集并增加暂停时间,因为 ZGC 需要更频繁地运行来回收内存。
另一方面,分配太大的堆大小可能会导致内存资源浪费。在内存使用和垃圾收集频率之间取得平衡非常重要。具体的最佳堆大小取决于应用程序的内存要求、实时集的大小以及系统的整体内存可用性等因素。
要指定堆大小,在启动 Java 应用程序时使用 -Xmx。例如,-Xmx32g将最大堆大小设置为 32 GB。
2.并发GC线程数(-XX:ConcGCThreads )
另一个需要考虑的调整选项是 ZGC 中并发垃圾收集 (GC) 线程的数量,可以使用标志进行配置-XX:ConcGCThreads=。ZGC 具有内置启发式功能,可以根据应用程序的特征自动选择最佳线程数。ZGC 中的默认启发式通常适用于大多数场景。但是,根据应用程序的具体行为和要求,您可能需要调整并发 GC 线程的数量。该参数决定了分配给垃圾收集器的CPU时间。分配太多线程可能会导致 GC 过度使用 CPU,从而夺走应用程序中宝贵的资源。另一方面,分配太少的线程可能会降低 GC 性能。
从JDK 17开始,ZGC引入了并发GC线程数的动态缩放。这意味着ZGC可以根据工作负载自动调整线程数量,从而减少手动调整该参数的可能性。
3.启用大页面(-XX:+UseLargePages)
配置 ZGC 以利用大页面可以提高吞吐量、减少延迟并缩短启动时间。大页面,也称为巨页,在 Linux/x86 系统上的大小为 2MB。大页面是大于标准页面大小的内存页面。它们具有减少内存管理开销和提高内存访问效率等优点。
要在ZGC中启用大页面,您需要-XX:+UseLargePages在JVM中配置该选项。
注意:启用大页面需要在操作系统级别完成某些配置。这些配置(例如将内存分配给大页面池和设置 Hugetlbfs 文件系统)超出了本文的范围。
4.启用透明(-XX:+UseTransparentHugePages)
使用显式大页面(如上所述)的替代方法是使用透明大页面 (THP)。THP 是 Linux 内核中的一项功能,可自动将标准内存页聚合为更大、更高效的巨页。THP 旨在通过减少与管理各个页面相关的开销来改进内存管理。通过将多个标准页面分组为单个大页面(通常大小为 2MB),THP 可以潜在地提高性能。
要在 JVM 中启用透明大页,可以使用-XX:+UseTransparentHugePages选项。这允许 Java 应用程序利用操作系统管理的大型聚合内存页。值得注意的是,THP 在某些情况下可能会引入延迟峰值,这使得它不太适合延迟敏感的应用程序。在启用 THP 之前,建议评估其对您的特定工作负载和性能要求的影响。
注意:在内核级别配置和管理透明大页可能需要额外的步骤,具体细节超出了本文的范围。
5. 启用 NUMA 支持(-XX:+UseNUMA)
ZGC 具有 NUMA 支持,这意味着它将尽力将 Java 堆分配定向到 NUMA 本地内存。NUMA 代表非统一内存访问,指的是多插槽系统中使用的架构设计。在 NUMA 系统中,内存被划分为多个内存节点,每个节点与特定的处理器或插槽相关联。与访问远程内存节点相比,每个处理器对其自己的本地内存节点的访问速度更快。
默认情况下,ZGC 启用 NUMA 支持,使其能够利用 NUMA 架构的优势。它自动检测并利用本地内存节点来优化内存访问并提高性能。但是,如果 JVM 检测到它必须使用单个 NUMA 节点上的内存,则将禁用 NUMA 支持。
在大多数情况下,您不需要显式配置 NUMA 支持。但是,如果您想覆盖 JVM 的决定,可以使用以下选项:
要显式启用 NUMA 支持:-XX:+UseNUMA
要显式禁用 NUMA 支持:-XX:-UseNUMA
注意: NUMA 支持对于多插槽 x86 机器或具有 NUMA 架构的其他系统尤其重要。它可能不会对单插槽或非 NUMA 系统的性能产生重大影响。
6. 将未使用的内存返回给操作系统(-XX:+ZUncommit)
ZGC 被有效地设计来管理大堆大小。当应用程序不需要时分配较大的堆大小可能会导致内存使用效率低下。默认情况下,ZGC 取消提交未使用的内存,将其返回给操作系统。可以使用 禁用此功能-XX:-ZUncommit。
-XmsZGC 确保内存不会在堆大小低于指定的最小堆大小 ( )的情况下未提交。因此,如果最小堆大小设置为与最大堆大小 ( -Xmx) 匹配,则取消提交功能将被隐式禁用。
为了提供管理未提交内存的灵活性,ZGC 允许您使用该选项配置未提交延迟-XX:ZUncommitDelay=,默认延迟为 300 秒。此延迟指定内存在符合取消提交资格之前应保持未使用状态的持续时间。
注意:允许 ZGC 在应用程序运行时提交和取消提交内存可能会影响应用程序的响应时间。-Xmx如果使用 ZGC 时实现极低延迟是主要目标,建议为最大堆大小 ( ) 和最小堆大小 ( )设置相同的值-Xms。此外,利用该-XX:+AlwaysPreTouch选项可能是有益的,因为它在应用程序启动之前预先分页内存,从而优化性能并减少延迟。
调整 ZGC 行为
研究 ZGC 的性能特征最好通过分析 GC 日志来实现。GC 日志包含有关垃圾收集事件、内存使用情况和其他相关指标的详细信息。有多种工具可以帮助分析 GC 日志,例如 GCeasy、IBM GC & Memory Visualizer、HP Jmeter 和 Google Garbage Cat。通过使用这些工具,您可以可视化内存分配模式、识别潜在瓶颈并评估垃圾收集的效率。这样可以在微调 ZGC 以获得最佳性能时做出明智的决策。
结论
总之,本文讨论了 ZGC 的各种 JVM 调整参数,旨在优化其在 Java应用程序中的性能。通过利用这些调整选项,开发人员可以根据其特定要求微调 ZGC 以提供最佳性能。此外,仔细分析 GC 日志并监控 ZGC的行为可以为其性能特征提供有价值的见解。通过试验这些调整参数并密切监视 GC 日志,开发人员可以释放 ZGC 的全部潜力并确保其 Java 应用程序中的高效垃圾收集。
相关文章:
Java ZGC 算法调优
ZGC 是一种专门的垃圾收集器,专注于管理大型堆并最大限度地减少 Java 应用程序中的暂停。它解决了内存密集型工作负载和一致的响应时间至关重要的场景中垃圾收集的挑战。利用并发处理能力和先进算法,ZGC 为优化 Java 应用程序的性能提供了有效的解决方案…...
【海思SS626 | 开发环境】编译整个SDK全过程以及问题汇总
目录 一、概述二、解压SDK,打补丁三、安装交叉编译工具✨3.1 安装 aarch64-mix410-linux.tgz✨3.2 安装 cc-riscv32-cfg11-musl-20220523-elf.tar.gz✨3.3 检查工具链版本,打印版本则表示安装成功 四、安装软件包✨4.1 安装软件包✨4.2 安装mtd-utils的依…...
83 # 静态服务中间件 koa-static 的使用以及实现
静态服务中间件:koa-static 中间件可以决定是否向下执行,如果自己可以处理,那么直接处理完毕结束,如果自己处理不了,next 方法会继续向下执行 新建 public 文件夹,里面添加 index.html、style.css 文件 …...
带讲解的自行车租赁系统,可做毕设/课设
适合人群: 马上毕业/需要毕设的同学 技术栈: 前后端分离 前端使用: Vue Element 后端使用: SpringBoot Mysql8.0 Mybatis 支付宝支付 功能截图: 分为管理员端和 普通用户端 和 维修人员端 阿里大佬亲讲 免费看地址: 见评论区...
mysql指令
1.删除表: drop table table_name; 2.查询表字段: select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAMEtable_name; 参考链接 3.切换数据库: use database_name 4.查看当前数据库所有表 show tables;...
【C语言】每日一题(半月斩)——day2
目录 一.选择题 1、以下程序段的输出结果是( ) 2、若有以下程序,则运行后的输出结果是( ) 3、如下函数的 f(1) 的值为( ) 4、下面3段程序代码的效果一样吗( ) 5、对于下面的说法,正确的是…...
电脑如何查看代理服务器IP?
许多人在使用互联网时可能会遇到需要使用代理服务器的情况。但是,你知道如何在电脑上查看代理服务器IP吗?本文将为您分享简单易懂的方法,帮助您轻松了解代理设置的秘密! 代理服务器在网络世界中担任着重要的角色,它可…...
【C++11】{}初始化、std::initializer_list、decltype、STL新增容器
文章目录 1. C11简介2. 统一的列表初始化2.1 {}初始化2.2 std::initializer_list 3. 声明3.1 auto3.2 decltype 4. nullptr5. 范围for循环6. 智能指针7. C11STL中的一些变化8. 演示代码 1. C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1…...
【FPGA项目】进阶版沙盘演练——报文收发(报文处理、CDC、CRC)
前言 书接上文【FPGA项目】沙盘演练——基础版报文收发_子墨祭的博客-CSDN博客,前面我们做了基础版的报文收发,相信对逻辑设计有了一定的认知,在此基础上,继续完善一个实际报文收发可能会遇到的一些处理: 报文处理握手…...
【程序员装机】自定义Edge浏览器用户目录
文章目录 前言修改Edge用户目录的批处理脚本上述批处理脚本的功能包括 总结 前言 本文将介绍Edge浏览器用户目录的批处理脚本方式修改,以自定义Edge浏览器的磁盘缓存目录和用户数据目录。 修改Edge用户目录的批处理脚本 以下是一个用于修改Edge浏览器用户目录的批…...
ubuntu18、20 cv_bridge 与自带opencv版本冲突问题
背景: nvidia tx2、xvaier 装机自带 ubuntu18 opencv4 后来我们会安装melodic的ros,ros中的cv_bridge 默认cv版本是3.2.0 编译带cv_bridge的代码时,会报错会崩溃,因为版本冲突了 为了解决该问题, 行之有效的一种…...
贝叶斯分位数回归、lasso和自适应lasso贝叶斯分位数回归分析免疫球蛋白、前列腺癌数据...
原文链接:http://tecdat.cn/?p22702 贝叶斯回归分位数在最近的文献中受到广泛关注,本文实现了贝叶斯系数估计和回归分位数(RQ)中的变量选择,带有lasso和自适应lasso惩罚的贝叶斯(点击文末“阅读原文”获取…...
css自学框架之图片懒加载
首先解释一下什么叫图片懒加载。图片懒加载是一种在页面加载时,延迟加载图片资源的技术,也就是说图片资源在需要的时候才会加载,就是在屏幕显示范围内加载图片,屏幕显示范围外图片不加载。 一、关键函数 用到的关键函数…...
RoutingKafkaTemplate,DefaultKafkaProducerFactory和 ReplyingKafkaTemplate
一、RoutingKafkaTemplate 1.1、RoutingKafkaTemplate 能做什么 RoutingKafkaTemplate可以根据目标topic名称在运行时选择生产者。 RoutingKafkaTemplate 不支持事务、execute、flush或metrics操作,因为这些操作的主题未知。 1.2、使用前提 RoutingKafkaTemplate 和 KafkaT…...
Flutter动态化开发之Fair实战
一、背景 目前移动端应用的版本更新, 最常见的方式是定期发版,无论是安卓还是iOS,都需要提交新的安装包到应用市场进行审核。审核通过后,用户在应用市场进行App的下载更新。而动态化, 就是不依赖更新程序安装包, 就能动态实时更新页面的技术。 相比动态化技术,定期发版…...
Stream流编程
流格式 Stream<T> filter(Predicate<? super T> predicate);-----> 参数:public interface Predicate<T> (函数式接口)----> 抽象方法:boolean test(T t);-----> 参数:public interface Consumer<T> (函…...
jenkins自动化脚本集成时钉钉消息未发送
在进行jenkins自动化脚本集成时,需要配置钉钉发送消息。钉钉的配置正确,测试钉钉消息发送成功,但是当构建项目时,却没有收到钉钉消息,报错如下: [钉钉插件]发送消息时报错: java.lang.NullPointerExceptio…...
java面试题第七天
一、java面试题第七天 1.方法重载和重写的区别? 方法重载:在同一个类中,不同的方法拥有同样的方法名,不一样的参数列表,这就叫做方法重载 **方法的重写:**描述的是父类和子类之间的。当父类的功能无法满…...
MATLAB入门-矩阵的运算
MATLAB入门-矩阵的运算 本篇文章为学习笔记,课程链接为:头歌 相关知识 常见的矩阵运算有算术运算、关系运算和逻辑运算。MATLAB中的所有变量都是以矩阵的形式存储的,单个变量就相当于一个1*1的矩阵。 算术运算 下面展示的是常见的矩阵之…...
[X3m]ros交叉编译
ros需要安装以下包 PYTHON_PACKAGE_LIST"lark lark-parser netifaces pyyaml ifcfg pyunicodedata " TogetheROS.Bot | TogetheROS.Bot用户手册 编译tros.b 1 使用docker文件 该部分操作均在开发机的docker内完成。 ## 创建目录 cd /mnt/data/kairui.wang/…...
【漏洞库】Fastjson_1.2.47_rce
文章目录 漏洞描述漏洞编号漏洞评级影响版本漏洞复现- 利用工具- 漏洞环境- 漏洞扫描- 漏洞验证- 深度利用- GetShell- EXP 编写 漏洞挖掘- 寻找入口点- 指纹信息 修复建议- 漏洞修复 漏洞原理 漏洞描述 Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越&am…...
zabbix 钉钉微信企微告警(动作操作消息内容模板)
一、环境配置 1、配置zabbix服务端 2、配置监控主机&监控项&监控模板 zabbix配置安装_this page is used to test the proper operation of _疯飙的蜗牛的博客-CSDN博客 二、触发器 触发器的本质就是一个条件判断,对于不同的监控数据来说,我…...
阿里云国际站云服务器数据备份方法有哪些?
阿里云国际站云服务器是一种根据云计算技术的虚拟服务器,它能够经过互联网提供计算资源和服务。在运用云服务器的过程中,数据备份是非常重要的一个环节。本文将介绍云服务器数据备份的办法,包含手动备份、主动备份和数据同步。 一、手动备份 …...
游戏笔记本电脑可以进行 3D 建模和渲染吗?有哪些优势与缺点?
3D 建模和渲染是创建令人惊叹的数字艺术、动画和游戏体验的最流行和最广泛使用的工具之一。随着技术的进步,对运行这些模型的强大计算机的需求呈指数级增长。对于那些寻求强大机器来处理 3D 建模任务的人来说,游戏笔记本电脑已成为一个可行的选择。 游戏…...
【AI】推理系统和推理引擎的整体架构
本文主要是对 B 站 Up 主 ZOMI酱 推理系统系列视频 的理解,可以认为是重点笔记。 一、深度学习模型的全生命周期 相信很多人和我一样,刚看到深度学习模型中的推理系统或推理引擎时是一头雾水,因为学习 DL 时通常关注于模型的设计和训练。下图…...
k8s集群中流水线部署微服务
k8s集群中流水线发布微服务 一、流水线部署微服务部署流程 二、微服务发布流程 pipeline {agent {node {label maven}}parameters {string(name: PROJECT_VERSION, defaultValue: v1.0, description: )string(name: PROJECT_NAME, defaultValue: , description: )}environment…...
Socks5代理与网络安全:保护您的隐私与数据
在今天数字化的世界中,隐私和网络安全已经成为至关重要的话题。Socks5代理作为一种强大的工具,不仅为用户提供了隐私保护,还在网络安全和爬虫领域发挥着关键作用。本文将深入探讨Socks5代理的工作原理、其在网络安全中的应用,以及…...
2024年山东高企申报注意事项
1、分析企业技术及财务报表 分析财务数据及企业主营产品和技术点。用以确定申报材料的撰写方向。一般耗时1周左右。(纺织厂、服装厂等传统行业面临申报中的面临研发人员比例不达标,研发费用不达标,高新技术产品比例不达标等难题。)…...
npm publish包报404,is not in the npm registry错误
1. 指定发布目标2. 登录npm,使用登录名发布包,包名命名原则“登录名/包名”,或 “包名” 3. 删除某一个版本npm unpublish pvfhv/eslint-config-prettier1.0.1 --force 删除后的版本不能重复使用,正式解释: Unfortun…...
pytest-基础
一.使用pytest,默认的测试用例的规则以及基础应用 1.模块名字必须已test_开头或者_test结尾 2.测试类必须以Test开头,并且不能有init方法 3.测试方法必须以test开头 示例代码 test_001.py import pytest class TestCase:def test_case(self):print("执行测试用例&quo…...
志勋网站建设公司/建网站教学
变量, 常量, 类型 import org.example.Main import java.util.stream.Stream// 编译时常量, 支持如下类型 : String ,Int ,Double ,Float ,Long ,Short ,Byte ,Char ,Booleanconst val MAX_VAlUE 256 fun main() {// 声明一个变量var aInt: Int 1 // kotlin可以自动推断出类…...
西安企业网站建设托管/辽阳网站seo
发现plt.scatter()不仅能画散点,还能调节点的大小,做成气泡图,所以自己准备写个总结,记录下!函数:matplotlib.pyplot.scatter(x, y, sNone, cNone, markerNone, cmapNone, normNone, vminNone, vmaxNone, a…...
有没有免费网站空间/seo整站优化哪家专业
Mysql 默认是没有开启这个权限的(只允许使用 host:localhost,或者 host:127.0.0.1),如果想用 host:192.168.1.* ,来访问mysql ,需要手动开启这个权限进入Mysql终端输入这个命令1.打开cmd窗口,进入MySql安装的bin目录2.执行命令登录数据库,之后会出现一行…...
泉州网站建设怎么收费/jsurl转码
一:范围分区 就是根据数据库表中某一字段的值的范围来划分分区,例如: 1 create table graderecord 2 ( 3 sno varchar2(10), 4 sname varchar2(20), 5 dormitory varchar2(3), 6 grade int 7 ) 8 partition by range(grade) 9 ( 10 …...
安徽省城乡建设网站/跨境电商怎么开店铺
为什么80%的码农都做不了架构师?>>> 添加环境变量,中增加一项,其中变量为为NLS_LANG,变量值为"AMERICAN_AMERICA.ZHS16GBK"(不包括双引号)。 重启toad后,即可看到原为乱码的内容,显示…...
wordpress 编辑图片无法显示/个人网站设计模板
弁言:我爱您没有是果为您是谁,而是我正在您里前是谁。接下去小编给列位读者分享1些恋爱英文本性署名,欢送各人浏览。1、Feeble story, just making excuses.惨白有力的陈述,只是正在诡辩罢了。2、I wait for you to come back.我等…...