07_Z Garbage Collector (ZGC)

2024-05-07 03:20
文章标签 07 zgc garbage collector

本文主要是介绍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)。

这篇关于07_Z Garbage Collector (ZGC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966181

相关文章

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言 PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完

07 v-if和v-show使用和区别

划重点: v-ifv-show 小葱拌豆腐 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="

java基础总结07-面向对象3(this关键字)

this是一个引用,它指向自身的这个对象。 看内存分析图 假设我们在堆内存new了一个对象,在这个对象里面你想象着他有一个引用this,this指向这个对象自己,所以这就是this,这个new出来的对象名字是什么,我们不知道,不知道也没关系,因为这并不影响这个对象在内存里面的存在,这个对象只要在内存中存在,他就一定有一个引用this。 看下面的例子分析: package cn.ga

【SpringMVC学习07】SpringMVC与前台的json数据交互

json数据格式在接口调用中、html页面中比较常用,json格式比较简单,解析也比较方便,所以使用很普遍。在springmvc中,也支持对json数据的解析和转换,这篇文章主要总结一下springmvc中如何和前台交互json数据。 1. 两种交互形式  springmvc和前台交互主要有两种形式,如下图所示: 可以看出,前台传过来的方式有两种,一种是传json格式的数据过来,另一种

周末总结(2024/09/07)

工作 人际关系核心实践: `要学会随时回应别人的善意,执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内,职场社交不要放在5min以外 职场的人际关系在面对利益冲突是直接质疑,要快准狠,不要内耗、 回复消息要控制在30mins之内,一定要及时回复`` 工作上的要点 现状(已经提了离职,last day在9月20号)

2024.09.07【读书笔记】| SMRTLink工具对PB组装疑难解答

在使用SMRT Link的pb_assembly_hifi命令进行组装分析时,可以参考以下步骤和信息: 使用pbcromwell show-workflow-details pb_assembly_hifi命令查看该工作流的详细信息。这将帮助你了解所需的输入参数和可选输入参数。 根据工作流的要求,你需要准备相应的输入文件。例如,对于单样本基因组组装,需要CCS(连续测序)的fastq文件路径作

【LeetCode】07.整数反转

题目要求 解题思路 这道题的难点在于怎么判断越界,我们无法直接与最大值或最小值比较,但是由于每一次我们的ret都需要乘10这个特性来使用ret与最大值或最小值除10进行比较 代码实现 class Solution {public:int reverse(int x) {int ret=0;while(x){//处理越界情况if(ret<INT_MIN/10||ret>INT_MAX

【大数据Java基础-JAVA 面向对象07】类成员(二)类结构 方法(四)递归方法

1.定义: 递归方法:一个方法体内调用它自身。 2.如何理解递归方法? > 方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。 > 递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。 3.举例: // 例1:计算1-n之间所自然数的和 public int getSum(int n) {// 3if (n == 1) {return 1;}

Kubernetes学习指南:保姆级实操手册07——calico安装、metric-server安装一、calico

七、Kubernetes学习指南:保姆级实操手册07——calico安装、metric-server安装 一、calico Calico是一个开源的虚拟化网络方案,支持基础的Pod网络通信和网络策略功能。 官方文档:Quickstart for Calico on Kubernetes | Calico Documentation 1、calico安装 ### 在Master控制节点执行

07_TensorFlow2图像编解码大揭秘:让图片说‘变’就‘变’,魔法还是科技?

1. 图像的编码和解码 在实际应用中,图像数据源格式多种多样,如:png\jpg\bmp等,而神经网络训练模型所需的图像的数据格式为:图像字节数据或Base64编码数据等。基于此,将png\jpg\bmp等格式的图像转换为字节数据的过程称为图像编码,将字节数据的图像转换为png\jpg\bmp等格式图像的过程称为图像解码。 2. 图像编码 Tensorflow图像编码的过程如下图所示,分