07_Z Garbage Collector (ZGC)

Z垃圾收集器(ZGC)是一种可扩展的低延迟垃圾收集器。ZGC可以在不超过一毫秒的情况下并发执行所有昂贵的工作,而不会停止应用程序线程的执行。它适用于需要低延迟的应用程序。暂停时间与正在使用的堆大小无关。ZGC适用于从几百兆字节到16TB的堆大小。

ZGC被设计为自适应且需要最小的手动配置。在Java程序执行期间,ZGC通过调整代大小、扩展GC线程数量和调整老年对象阈值动态适应工作负载。主要调优参数是增加最大堆大小。

ZGC有两个版本:新版分代版和传统非分代版。非分代ZGC是较旧的版本,它不利用代来优化运行时特性。鼓励用户转向使用更新的分代式ZGC。

使用命令行选项 -XX:+UseZGC -XX:+ZGenerational 可启用分代式ZGC。

使用命令行选项 -XX:+UseZGC 可启用非分代式ZGC。

设置堆大小

ZGC最重要的调优选项是设置最大堆大小,可以使用 -Xmx 命令行选项进行设置。由于ZGC是一种并发收集器,必须选择一个最大堆大小,使得堆可以容纳应用程序的存活集,并且在GC运行时有足够的余地来处理分配。所需的余地大小很大程度上取决于分配速率和应用程序的存活集大小。一般来说,给ZGC更多的内存越好。但同时,浪费内存是不可取的,因此关键在于找到内存使用和GC运行频率之间的平衡。

ZGC还有另一个与堆大小相关的命令行选项,名为 -XX:SoftMaxHeapSize。它可以用于设置Java堆能够增长到多大的软限制。ZGC会努力保持不超过这个限制,但仍然允许增长到最大堆大小以上。只有在需要防止Java应用程序停滞等待GC回收内存时,ZGC才会使用超过软限制的内存。例如,使用命令行选项 -Xmx5g -XX:SoftMaxHeapSize=4g 时,ZGC将以4GB作为其启发式算法的限制,但如果无法将堆大小保持在4GB以下,则仍然允许暂时使用高达5GB的内存。

将未使用的内存返回到操作系统

默认情况下,ZGC会释放未使用的内存,并将其返还给操作系统。这对于关注内存占用的应用程序和环境非常有用,但可能会对Java线程的延迟产生负面影响。您可以使用命令行选项 -XX:-ZUncommit 来禁用此功能。此外,不会释放内存以使堆大小缩小到低于最小堆大小(-Xms)。这意味着如果将最小堆大小(-Xms)配置为等于最大堆大小(-Xmx),则此功能将被隐式禁用。

您可以使用 -XX:ZUncommitDelay=<seconds>(默认值为300秒)来配置取消提交延迟。该延迟指定了内存在未使用多长时间后才能进行取消提交。


注意:允许垃圾回收在应用程序运行时提交和取消提交内存可能会对Java线程的延迟产生负面影响。如果极低的延迟是使用ZGC的主要原因,请考虑将 -Xmx 和 -Xms 设置为相同的值,并使用 -XX:+AlwaysPreTouch 在应用程序启动之前预取内存页。

使用大页

将ZGC配置为使用大页通常会带来更好的性能(以吞吐量、延迟和启动时间为代价),并且几乎没有实质性的劣势,除了设置稍微复杂一些。设置过程通常需要 root 权限,这就是为什么默认情况下它是禁用的。

在 Linux 上启用大页面

在Linux x86系统上,大页面(也称为“超大页面”)的大小为2MB。

假设您希望使用16GB的Java堆。这意味着您需要 16GB / 2MB = 8192 个超大页面。

堆至少需要16GB(8192页面)的内存分配给超大页面池。堆以及JVM的其他部分将使用大页面来存储各种内部数据结构(如代码堆和标记位图)。在此示例中,您将保留9216个页面(18GB),以便允许额外的2GB非Java堆内存分配使用大页。

配置系统的超大页面池以拥有所需数量的页面(需要root权限):

$ echo 9216 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

请注意,如果内核无法找到足够的空闲超大页面来满足请求,则以上命令无法成功执行。此外,请注意,内核可能需要一些时间来处理请求。在继续之前,请检查分配给池的超大页面数量,以确保请求成功并已完成:

$ cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages9216

在 Linux 上实现透明的大页面

与之前描述的显式使用大页不同的另一种选择是使用透明大页(transparent huge pages)。通常不建议对延迟敏感的应用程序使用透明大页,因为它往往会导致意外的延迟波动。然而,值得尝试一下,观察您的工作负载是否受到影响。

注意:在Linux系统上,启用透明大页的情况下使用ZGC需要内核版本大于等于4.7。

使用以下选项在虚拟机中启用透明大页:

-XX:+UseLargePages -XX:+UseTransparentHugePages

这些选项告诉JVM对其映射的内存发出madvise(...,MADV_HUGEPAGE)调用,这在使用透明大页的madvise模式下非常有用。

要启用透明大页,还需要通过启用madvise模式来配置内核。

$ echo madvise > /sys/kernel/mm/transparent_hugepage/enabled

ZGC使用shmem大页来管理堆内存,因此还需要配置以下内核设置:

$ echo advise > /sys/kernel/mm/transparent_hugepage/shmem_enabled

在比较不同GC的性能时,检查这些内核设置非常重要。一些Linux发行版会强制将/sys/kernel/mm/transparent_hugepage/enabled配置为always以启用私有页面的透明大页,同时将/sys/kernel/mm/transparent_hugepage/shmem_enabled保持默认值never。在这种情况下,除了ZGC外,所有GC都将使用透明大页来管理堆。更多信息请参阅《透明大页支持》(Transparent Hugepage Support)。

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

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

相关文章

git使用注意事项事项

以下操作均在gitee平台上实现 文章目录 1、本地仓库和远程仓库有冲突2、git提交自动忽略某些文件3、git无法push提交到远程仓库 1、本地仓库和远程仓库有冲突 在web端修改了文件内容或者删除了文件&#xff0c;本地仓库需要重新把远程仓库拉取到本地&#xff0c;或者强制提交到…

关于面试真题的压迫

1.请描述一下您在使用JavaScript进行DOM操作时&#xff0c;如何提高页面性能和用户体验&#xff1f; 使用事件委托&#xff1a;在父元素上监听事件&#xff0c;而不是为每个子元素都添加事件监听器。这样可以减少事件处理程序的数量&#xff0c;提高性能。 缓存DOM查询&#x…

Prometheus 2: 一个专门评估其他语言模型的开源语言模型(续集)

普罗米修斯的续集来了。 专有的语言模型如 GPT-4 经常被用来评估来自各种语言模型的回应品质。然而,透明度、可控制性和可负担性等考虑强烈促使开发专门用于评估的开源语言模型。另一方面,现有的开源评估语言模型表现出关键的缺点:1) 它们给出的分数与人类给出的分数存在显著差…

图像处理-图像平滑

图像平滑 前言一、概念介绍1.1 图像的平滑1.2 图像中噪声的分类1.3 MATLAB的添加噪音代码 二、空间域平滑滤波2.1 均值滤波2.2 原理计算 总结 前言 在图像的获取、传输和存储过程常常收到各种噪声的干扰和影响&#xff0c;使得图像的质量下降&#xff0c;为了获得高质量的数字…

读天才与算法:人脑与AI的数学思维笔记20_数学图灵测试

1. 数学图灵测试 1.1. 能不能将这种计算机证明语言翻译成易于与人交流的方式呢&#xff1f; 1.1.1. 剑桥大学的两位数学家蒂莫西高尔斯&#xff08;Timothy Gowers&#xff09;和莫汉加内萨林加姆&#xff08;Mohan Ganesalingam&#xff09;开展了此项研究 1.1.1.1. 他们决…

与Apolo共创生态: Apollo X企业自动驾驶解决方案的亮点

文章目录 前言技术革新的里程碑Apollo X企业自动驾驶解决方案的亮点Application X企业预制套件的多场景覆盖Studio X企业协同工具链的全周期支持第一阶段&#xff1a;上机系统构建第二阶段&#xff1a;POC搭建第三阶段&#xff1a;规模运营小结 共创生态&#xff0c;共享未来共…

catchtap 和 bindtap区别

做项目遇见的问题&#xff1a; 当你点击按钮触发事件后&#xff0c;当前用户和目标用户ID相同时&#xff0c;直接return&#xff0c;但是renturn时如何保证&#xff1a; 整个界面的触发函数是toDetailsTap&#xff0c;点我私聊按钮的触发函数是handleChat&#xff0c;如何保证…

Mysql数据在磁盘上的存储结构

一. 前言 一行数据的存储格式大致如下所示: 变长字段的长度列表&#xff0c;null值列表&#xff0c;数据头&#xff0c;column01的值&#xff0c;column02的值&#xff0c;column0n的值… 二. 变长字段 在MySQL里有一些字段的长度是变长的&#xff0c;是不固定的&#xff0c;…

Linux loadkeys命令教程:键盘布局的加载和修改(附实例详解和注意事项)

Linux loadkeys命令介绍 loadkeys命令是用于加载或修改键盘布局的。它通常在系统启动时被调用&#xff0c;用于加载适当的键盘布局。此命令非常有用&#xff0c;尤其是在需要切换不同键盘布局的情况下。 Linux loadkeys命令适用的Linux版本 loadkeys命令在大多数Linux发行版…

ContEA阅读笔记

Facing Changes: Continual Entity Alignment for Growing Knowledge Graphs 面对变化&#xff1a;不断增长的知识图谱的持续实体对齐 Abstract 实体对齐是知识图谱(KG)集成中一项基本且重要的技术。多年来&#xff0c;实体对齐的研究一直基于知识图谱是静态的假设&#xff…

人工智能的发展将如何重塑网络安全

微信搜索关注公众号网络研究观&#xff0c;获取更多信息。 人们很容易认为人工智能 (AI) 真正出现是在 2019 年&#xff0c;当时 OpenAI 推出了 ChatGPT 的前身 GPT-2。 但现实却有些不同。人工智能的基础可以追溯到 1950 年&#xff0c;当时数学家艾伦图灵发表了题为“计算机…

【DevOps】探索 Linux 的世界:文件系统和基本命令

目录 一、Linux文件系统 1、核心概念&#xff1a; 2、 文件系统类型 3、目录结构 4、权限与所有权 5、 符号链接与硬链接 二、文件系统相关linux命令 1、 ls 2、 cd 3、 pwd 4.、mkdir 5、rmdir 6、rm 7、mv 8、cp 9、 mount 10、 umount 一、Linux文件系统 …

MySql中深度分页的问题

什么是深度分页&#xff1f; MySql深度分页的问题&#xff0c;就是比如我们需要所查询出的表数据量较大&#xff0c;需要进行查询结果返回集的后面部分&#xff0c;所出现的性能问题。 比如说我们有一个一百万数据量的表&#xff0c;我们分页需要查询99990,10&#xff0c;数据库…

微信小程序如何使用svg矢量图标

微信小程序如何使用自定义SVG矢量图标 在微信小程序中&#xff0c;经常会用到小图标来装饰界面&#xff0c;我们常用的方法就是引用第三方的图标&#xff0c;但会存在收费或者找不到合适的图标&#xff0c;这时候我建议可以自行编写svg图标代码&#xff0c;就可以随心所欲的使…

【一起深度学习——kaggle叶子分类】

kaggle 叶子分类 目的&#xff1a;将叶子进行分类。实现步骤&#xff1a;1、数据处理&#xff1a;2、加载数据3、 定义残差块4、定义Resnet模型。5、定义训练以及评估函数&#xff1a;6、开始训练&#xff1a;7、输出结果&#xff1a; 目的&#xff1a;将叶子进行分类。 实现步…

知识图谱:人工智能的“核心驱动力”

知识图谱&#xff1a;人工智能的“核心驱动力” 一、人工智能与知识图谱二、知识图谱的定义与重要性三、知识图谱工程师的薪资情况四、知识图谱的应用领域六、知识图谱的未来展望七、总结 一、人工智能与知识图谱 人工智能&#xff08;AI&#xff09;作为21世纪的前沿技术&…

设备树与/sys/bus/platform/devices与/sys/devices目录关系

设备树与sys/bus/platform/devices sysfs文件系统中/sys/bus/platform/devices下的设备是由设备树生成&#xff0c; 根节点下有compatible的子节点都会在/bus/platform/devices生成节点 总线 I2C、SPI 等控制器会在/bus/platform/devices生成节点 总线 I2C、SPI 节点下的子节点…

Linux dumpkeys命令教程:详解键盘映射表的显示和操作(附案例详解和注意事项)

Linux dumpkeys命令介绍 dumpkeys命令在Linux中用于显示键盘映射表。它将键盘驱动的转换表的当前内容以keymaps(5)指定的格式写入标准输出。 Linux dumpkeys命令适用的Linux版本 dumpkeys命令在大多数Linux发行版中都可以使用&#xff0c;包括但不限于Debian、Ubuntu、Alpin…

牛客网刷题 | BC78 KiKi说祝福语

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 2020年来到了&#…

【Qt】按钮类控件

文章目录 1 :peach:Push Button:peach:2 :peach:Radio Buttion:peach:3 :peach:Check Box:peach:4 :peach:Tool Button:peach: 1 &#x1f351;Push Button&#x1f351; 使⽤ QPushButton 表⽰⼀个按钮&#xff0c;这也是当前我们最熟悉的⼀个控件了&#xff0c;QPushButton …