浅析Java虚拟机中的ZGC

news2024/11/15 13:02:55

引言

为什么需要垃圾回收(Garbage Collection)

垃圾回收是Java开发中的关键机制,负责自动管理内存,防止内存泄漏,提高开发效率和应用程序的稳定性。

Java中主要的垃圾回收方法

  1. 标记-清除算法(Mark and Sweep): 这是最早的垃圾回收算法之一。它首先标记所有活动对象,然后清除未标记的对象。缺点是会产生内存碎片。
  2. 复制算法(Copying): 将堆分为两个区域,每次只使用其中一个,将存活对象从一个区域复制到另一个区域,然后清除原区域中的所有对象。这减少了内存碎片,但需要额外的内存空间。
  3. 标记-整理算法(Mark and Compact): 类似于标记-清除算法,但在清除后会将存活对象紧凑地移动到堆的一端,以减少内存碎片。
  4. 分代算法(Generational): 堆内存分为年轻代和老年代,大部分对象在年轻代中回收,年龄较大的对象会升级到老年代。年轻代使用复制算法,老年代使用标记-整理算法或标记-清除算法。
  5. 引用计数(Reference Counting): 每个对象维护一个引用计数,当引用计数为零时,对象被回收。然而,它不能处理循环引用问题。
  6. Java HotSpot VM的G1(Garbage-First)收集器: G1是一种分代垃圾回收器,它采用了多阶段的回收策略,可以在更短的停顿时间内实现高吞吐量。
  7. Java HotSpot VM的ZGC(Z Garbage Collector): ZGC是一种并发垃圾回收器,旨在提供低停顿时间和大内存支持。

每种垃圾回收方法都有其优点和缺点,选择合适的垃圾回收方法取决于应用程序的性能需求和内存特征。不同的垃圾回收器可以在不同的情况下提供更好的性能和响应时间。

几种垃圾回收机制的使用情况

  1. CMS收集器(Concurrent Mark-Sweep Garbage Collector): CMS收集器是一种并发垃圾回收器,适用于需要低停顿时间的应用程序。在JDK 8及之前的版本中,它是通过启用-XX:+UseConcMarkSweepGC选项来选择的。
  2. G1收集器(Garbage-First Garbage Collector): G1收集器是一种面向大堆内存的垃圾回收器,它在JDK 7中首次引入,在JDK 9及之后的版本中,G1成为了默认的垃圾回收器。
  3. ZGC收集器(Z Garbage Collector): ZGC是一种高度并发的垃圾回收器,旨在提供极低的停顿时间。它在JDK 11中首次引入,可以通过-XX:+UseZGC选项来启用。

为什么需要ZGC

G1垃圾收集器采用了部分区域回收的处理方式,有效解决了传统垃圾收集器中全堆扫描所带来的性能问题,极大地改善了在堆内存较大情况下的停顿时间。然而,随着硬件性能的不断提升,G1回收器也面临着极大的性能限制。尽管G1经过多个版本的优化和调优,已经接近极限,但仍然无法满足日益增长的机器内存需求。

说到底,G1的性能还是不能满足现阶段的硬件配置,G1的GC停顿时间相对较长。

  1. 低停顿时间需求: 传统的垃圾回收器在进行全堆清理时可能导致较长的停顿时间,这对于需要高响应性和低延迟的应用程序是不可接受的。ZGC的设计目标之一是将停顿时间限制在10毫秒以内,以满足这些应用程序的需求。
  2. 大内存支持: 随着应用程序的复杂性和数据量的增加,需要能够管理大内存的垃圾回收器。传统的垃圾回收器在处理大内存时可能会遇到性能问题,而ZGC旨在为大型内存提供高性能的解决方案。
  3. 并发性: 随着多核处理器的普及,对于高度并发的垃圾回收器的需求也在增加。ZGC采用了高度并发的回收策略,几乎所有垃圾回收操作都可以与应用程序并发执行,以减少停顿时间。
  4. 自适应性: ZGC具有自适应性,它可以根据应用程序的工作负载和内存使用模式自动调整自身的行为,无需手动调整垃圾回收器的参数。这使得ZGC在不同应用程序和不同工作负载下都能提供良好的性能。

总之,ZGC的引入是为了满足现代Java应用程序对大堆内存、低停顿时间和高并发性的需求。它提供了一种强大的垃圾回收器,可以在处理大型、高性能、实时应用程序时发挥重要作用,同时尽量减少停顿时间,提供更好的用户体验。这使得ZGC成为Java生态系统中的重要组成部分,特别是对于需要高度可扩展性和性能的应用程序。

ZGC为什么这么快

4.1、分代模型和分区模型

传统的垃圾回收器都采用分代的垃圾回收模型。新一代ZGC采用**分区模型(类似于G1),分为三种类型的分区(2MB、32MB、N*2MB)**在ZGC中,分区模型将整个堆内存分成多个连续的区域(或称为分区),每个区域的大小通常在几百兆字节到几个吉字节之间。这些区域可以包括年轻代、老年代以及其他一些特殊用途的区域。分区模型的主要目标是允许垃圾回收器以更精细的粒度管理内存,从而提高内存的使用效率和降低停顿时间。

•**低延迟:**ZGC的分区模型允许并发地处理内存分配和回收操作,从而减少了垃圾收集的停顿时间。相比之下,分代模型需要在不同代之间进行对象的复制或移动,可能会导致更长的停顿时间。

•**内存利用率高:**ZGC的分区模型可以动态地调整页的大小,以适应不同大小的对象。这样可以提高内存的利用率,减少内存碎片的产生。而分代模型中,不同代的内存空间是固定的,可能会导致内存碎片的问题。

•**可伸缩性:**ZGC的分区模型允许将堆内存划分为多个页区,并且每个页区都有独立的垃圾收集线程。这样可以实现垃圾收集的并行性,提高系统的可伸缩性和吞吐量。而分代模型中,不同代的垃圾收集是串行或并发-串行的,可能无法充分利用多核处理器的性能。

•**适应大内存堆:**ZGC的分区模型可以有效地管理大内存堆。它可以根据需要动态地增加或减少页的数量,以适应大内存堆的需求。而分代模型中,不同代的内存空间是固定的,无法有效地管理大内存堆。

image-20240122155056567

4.2、GC标记信息位置的变化

传统垃圾回收器通过扫描堆中的对象(扫描堆空间是很慢的),根据对象头中的可达性标记信息,来确定对象是否应该被回收。

ZGC不直接依赖于对象头中的信息来进行垃圾回收决策,而是把GC信息存在内存引用地址上。GC时通过扫描栈上的内存引用指针来确定对象的引用关系和可达性,从而来判断对象是否应该被回收。

image-20240122160800942

4.3、引用指针的变化-指针着色

在ZGC中,为了减少垃圾回收对应用程序的影响,采用了一种称为“指针着色”的技术。这种技术利用了64位指针的高位(通常是未使用的位)来存储关于对象的元信息,而不是单独维护这些信息。这样,ZGC可以在不增加额外内存开销的情况下,快速检查和更新对象的状态。

ZGC通过64位指针(64位操作系统才支持)的高位来标识对象的可达性,其中第44位到47位标识GC信息

image-20240122160959235

在染色指针中,高18位都是0暂未使用,剩余的46位实际上是能支持64TB的内存的,但是目前来说计算机内存空间还没这么大。于是剩余的46位中,高4位用来保存了4个标志位,低42位置才是用来保存对象的指针,所以ZGC最大可以管理的内存不超过4TB。

小结

ZGC(Z Garbage Collector)是Java虚拟机(JVM)中的一种垃圾回收机制,旨在为大内存应用程序提供低延迟的垃圾回收。以下是ZGC的一些主要应用和特点:

应用场景

  1. 大内存应用:ZGC特别适用于需要管理大量内存的应用程序。它可以有效地管理几百MB到几TB的堆内存。
  2. 需要低延迟的系统:在需要保持低延迟的系统(例如实时交易系统、高频交易平台、大型在线服务等)中,ZGC能够显著减少垃圾回收引起的停顿时间。
  3. 云基础设施和微服务:对于运行在云环境或基于微服务架构的应用程序,ZGC提供了更好的性能和资源管理,有助于提高云基础设施的整体效率。

特点

  1. 并行和并发:ZGC在执行大部分垃圾回收任务时能够并行和并发地工作,这意味着它可以在应用程序运行时进行垃圾回收,减少停顿时间。
  2. 指针着色技术:ZGC使用指针着色技术,通过在指针的高位存储额外信息,来优化内存管理和减少内存开销。
  3. 可伸缩性:ZGC被设计为可伸缩的垃圾回收器,无论是在小堆还是在非常大的堆上都能高效工作。
  4. 低延迟:ZGC的主要优势是它可以实现极低的延迟,这对于需要快速响应的应用程序来说是非常重要的。
  5. 可用性:随着Java版本的更新,ZGC的可用性和稳定性不断提升,成为更多Java应用程序的可行选择。

当前状态和未来发展

ZGC最初在OpenJDK 11中作为实验性功能引入,并在后续版本中不断发展。它在基准测试中展现出了有希望的性能提升,并吸引了低延迟和内存密集型应用开发者的关注。随着ZGC的成熟和稳定性提高,预计它将成为更多要求低延迟和可扩展性的Java应用程序的首选垃圾回收器。

参考文章

[https://juejin.cn/post/7322156804849352714?searchId=2024012215395565B476D862AE75E50833#heading-5](

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

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

相关文章

YZ系列工具之YZ05:代码运行中调用“计算器”

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套一部VBA手册,教程分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的…

CentOS搭建DNS服务器

服务器规划 DNS服务器IP为:172.16.32.253 需要自定义域名解析 172.16.32.253 dns.zhangsan.com 172.16.32.128 test1.zhangsan.com 172.16.32.129 test2.zhangsan.com 172.16.32.130 www.zhangsan.com 1. 服务器初始化 [rootlocalhost ~]# hostnamectl set-hostnam…

python|写一个简单的web应用框架

写应用框架需要写底层服务器么? 这个要区分2种情况,如果应用框架,你没有参考WSGI标准,那么在写应用框架之前,你就必须要定义一套属于自己的服务器,当然本文不采取这种方式,专业的事情应该专业的人来做。我…

springboot集成easypoi

easypoi,主打的功能就是容易,通过简单的配置&#xff0c;就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出 pom导入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

实现钉钉与宁波银行对接,助力东吴黄金集团财务智能化

客户介绍&#xff1a; 某黄金集团有限公司是一家在国内外黄金市场上具有重要影响力的综合性黄金企业。该公司拥有一支高素质、专业化的团队&#xff0c;具备丰富的行业经验和卓越的执行力。在业务范围上&#xff0c;该公司涵盖了黄金勘探、采选、冶炼、加工、销售等全产业链&a…

华为机考入门python3--(0)模拟题2-vowel元音字母翻译

分类&#xff1a;字符串 知识点&#xff1a; 字符串转list&#xff0c;每个字符成为list中的一个元素 list(string) 字符串变大小写 str.upper(), str.lower() 题目来自【华为招聘模拟考试】 # If you need to import additional packages or classes, please import …

一篇搞定大论文参考文献,从找文献到交叉引用全流程

我们在写论文过程中&#xff0c;肯定会引用他人的文献&#xff0c;根据自己的写作经历&#xff0c;总结了一套很实用且不会出错的引用方法。1、记录文献顺序 你在论文中每引用一篇文献&#xff0c;你就在文献后加上[1][2]…[n]&#xff0c;然后新建一个word文档&#xff0c;在…

TCP高并发服务器简介(select、poll、epoll实现与区别)

select、poll、epoll三者的实现&#xff1a; select实现TCP高并发服务器的流程&#xff1a; 一、创建套接字&#xff08;socket函数&#xff09;&#xff1a;二、填充服务器的网络信息结构体&#xff1a;三、套接字和服务器的网络信息结构体进行绑定&#xff08;bind函数&…

七款网工在线画拓扑工具

网络工程师一般会使用多种软件进行绘图&#xff0c;以下是一些常用的软件&#xff1a; Visio&#xff1a;这是由微软开发的一款流程图和矢量图绘制软件&#xff0c;网络工程师通常使用它来绘制网络拓扑图、网络架构图等。亿图图示专家&#xff08;Edraw Max&#xff09;&#…

遇到继需证件照的时候怎么办?

你是否曾经遇到过这样的情况&#xff1a;急需一张证件照&#xff0c;却没有时间去照相馆或复印店&#xff0c;而且手头也没有现成的照片。这时候&#xff0c;你可能会感到很困扰&#xff0c;不知道该怎么办才好。别担心&#xff0c;今天我将为你揭示如何在短短一分钟内制作出自…

矩阵和矩阵如何相乘?

矩阵与矩阵相乘遵循特定的数学规则。为了相乘&#xff0c;第一个矩阵的列数必须等于第二个矩阵的行数。矩阵乘法的结果是一个新矩阵&#xff0c;其行数等于第一个矩阵的行数&#xff0c;列数等于第二个矩阵的列数。矩阵乘法不满足交换律&#xff0c;即 AB≠BA。 例子&#xff…

MySQL--删除数据库(2)

使用普通用户登陆 MySQL 服务器&#xff0c;你可能需要特定的权限来创建或者删除 MySQL 数据库&#xff0c;所以我们这边使用 root 用户登录&#xff0c;root 用户拥有最高权限。 在删除数据库过程中&#xff0c;务必要十分谨慎&#xff0c;因为在执行删除命令后&#xff0c;所…

基于人工蚁群、蚁群、遗传算法的多目标任务分配

matlab2020a可运行 基于人工蚁群、蚁群、遗传算法的多目标任务分配资源-CSDN文库

HAL库配置FreeRTOS

1、CMSIS_V1和CMSIS_V2版本主要的区别在于&#xff0c;CMSIS_V2兼容支持的硬件更多&#xff0c;内存耗费更多&#xff1b;对于常见的Cortex-M3、M4、M7芯片&#xff0c;选择V1即可。 2、创建任务 Task and Quenes&#xff1a; 任务与队列的创建。Timers and Semaphores&#x…

Maven下载及安装,集成eclipse中,配置环境变量,创建maven项目等

这里写目录标题 Maven环境配置环境变量&#xff1a;eclipse中配置maveneclipse创建maven项目 Maven环境 解压 配置&#xff1a; 本地仓库的位置&#xff1a; <!-- 配置maven本地仓库 --> <!-- 目录可以提前创建&#xff0c;也可以后期生成 --><localReposito…

the command setlocal

vs编译cmake出现the command setlocal&#xff0c;原因权限不够&#xff0c;找到命令所在文件夹。 我的是把vs生成的python安装到"C:\Program Files\Python311" 1、右击属性&#xff0c;再点安全&#xff0c;再点高级 2、修改所有者为Administrators&#xff0c;点…

VUE项目目录与运行流程(VScode)

各目录对应名称含义 main.js&#xff08;导入App.vue&#xff0c;基于App.vue创建结构渲染index.html&#xff09; //核心作用&#xff1a;导入App.vue&#xff0c;基于App.vue创建结构渲染index.html//1.导入Vue核心包 import Vue from vue//2.导入App.vue根组件 import App f…

springcloud alibaba sentinel熔断降级

简介 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 sentinel相当于hystrix的升级版&#xff0c;加入了web界面&#xff0c;能够实时在线的改变流…

140:vue+leaflet加载here地图(v2软件多种形式)

第140个 点击查看专栏目录 本示例介绍如何在vue+leaflet中添加HERE地图(v2版本的软件),并且含多种的表现形式。包括地图类型,文字标记的设置、语言的选择、PPI的设定。 v3版本和v2版本有很大的区别,关键是引用方法上,请参考文章尾部的API链接。 直接复制下面的 vue+leaf…

茅台瑞幸合作“龙年酱香巧克力”;黄仁勋英伟达中国区年会;马斯克预言:20年后地球10亿个人形机器人;闲鱼微信小程序即将上线;张雪峰向郑州大学捐款300万

今日精选 • 茅台与瑞幸合作“龙年酱香巧克力”饮品开卖&#xff0c;单杯优惠价18元• 黄仁勋现身英伟达中国区年会• 马斯克支持大胆预言&#xff1a;20年后地球上将有大约10亿个人形机器人• 闲鱼微信小程序即将上线• 张雪峰向郑州大学捐款300万 科技动态 • Adobe 发布 …