浅析Java虚拟机中的ZGC

引言

为什么需要垃圾回收(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.mzph.cn/news/639835.shtml

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

相关文章

暴力破解常见的服务器

目录 使用 pydictor 生成自己的字典工具liunx下载使用常用的参数说明插件型字典 (可自己根据 API 文档开发) 使用 hydra 工具在线破解系统用户密码使用 hydra 破解 windows 7 远程桌面密码使用 hydra 工具破解 ssh 服务 root 用户密码 使用 Medusa 工具在线破解medusa参数说明M…

jquery学习-1

jquery学习-1 1.jquery类似的框架 MooTools 对比反应时间2.Jquery Api jquery api中文文档 jquery注重的是看文档 3.Jquery下载和导入(压缩版) Jquery 下载 下载后导入项目中进行使用 <!DOCTYPE html> <html><head><meta charset"utf-8"…

埋点自动化测试框架设计

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 大数据时代&#xff0c;多数的web或app产品都会使用第三方或自己…

SpringCloud Alibaba 深入源码 - Nacos 分级存储模型、支撑百万服务注册压力、解决并发读写问题(CopyOnWrite)

目录 一、SpringCloudAlibaba 源码分析 1.1、SpringCloud & SpringCloudAlibaba 常用组件 1.2、Nacos的服务注册表结构是怎样的&#xff1f; 1.2.1、Nacos的分级存储模型&#xff08;理论层&#xff09; 1.2.2、Nacos 源码启动&#xff08;准备工作&#xff09; 1.2.…

HubSpot SEO功能好用吗?

HubSpot对于SEO&#xff08;搜索引擎优化&#xff09;提供了全面的工具和功能&#xff0c;帮助用户优化其网站以在搜索引擎中取得更好的排名。以下是关于HubSpot SEO的一些关键方面&#xff1a; 内容优化&#xff1a; HubSpot的内容工具允许用户创建并优化吸引人的内容。通过关…

激光雷达标定入门(5)Docker网络配置

1 前言 这一步是对之前专栏中一键安装介绍的一点扩展&#xff0c;是因为在后续的部署中&#xff0c;特别是雷达的驱动中&#xff0c;发现在docker的容器中无法接到雷达的数据&#xff0c;但是在容器外功能包能正常收到雷达的信号&#xff0c;后面发现是容器的IP没有在雷达的IP…

最新阿里云免费SSL证书申请使用介绍

为网站部署SSL证书已经是现在站长的必须要做的工作&#xff0c;然而SSL证书并不全是免费的&#xff0c;免费且好用的资源也越来越有限&#xff0c;毕竟嘛&#xff0c;这些都需要成本。 PS&#xff1a;最下方有最终建议方案。 本文介绍当前(2024年)阿里云免费SSL证书信息。 阿…

二极管解读:封装与外观、参数意义、发展历史与未来趋势

在电子技术不断进步的今天&#xff0c;二极管这一基础元件的作用不断扩大&#xff0c;其性能及应用成为电子设计师和爱好者们讨论的热门话题。本文将从四个角度为您解读二极管的世界&#xff1a;封装和外观特征、参数及其重要意义、发展历史&#xff0c;以及未来技术发展趋势。…

Vue3使用

1、列表实现 <el-table :data"tableData" border style"width: 100%" selection-change"handleSelectionChange" :header-cell-style"{text-align:center}"><el-table-column type"selection" width"55"…

【注解】@RequiredArgsConstructor 按需自动生成构造函数,举例说明

RequiredArgsConstructor 是Lombok库中的一种注解&#xff0c;它用于自动生成构造函数&#xff0c;针对于final字段的构造函数。它的作用包括以下几点&#xff1a; 自动生成构造函数&#xff1a;RequiredArgsConstructor 注解自动生成一个构造函数&#xff0c;该构造函数接受标…

以太坊账户地址与比特B地址生成方法对比

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 以太坊和比特B地址在生成方…

17.JVM-[一篇通]

文章目录 JVM1.JVM 简介 (一个进程有一个JVM)1.1JVM 发展史1.2 JVM 和《Java虚拟机规范》 2.JVM 运行流程2.1JVM 执行流程 3.JVM 运行时数据区3.1 堆&#xff08;线程共享 一个进程只有一份堆&#xff09;3.2Java虚拟机栈&#xff08;线程私有 每个线程都有一份属于自己的栈&am…

Linux网络编程(二-套接字)

目录 一、背景知识 1.1 端口号 1.2 网络字节序 1.3 地址转换函数 二、Socket简介 三、套接字相关的函数 3.1 socket() 3.2 bind() 3.3 connect() 3.4 listen() 3.5 accept() 3.6 read()/recv()/recvfrom() 3.7 send()/sendto() 3.8 close() 四、UPD客服/服务端实…

规范文字引言与材料

撰写引言 什么是引言&#xff1f; 引言又叫前言、绪论、引子、绪言等。 引言写在书或文章的正文前面&#xff0c;是类似序言或导言的部分。 在科研论文中&#xff0c;引言是引导读者了解研究背景、目的、 意义和研究问题的关键部分。对于人工智能方向的论 文&#xff0c;引言…

x-cmd pkg | curl - 极其强大的网络请求处理工具

目录 简介用户首次快速实验指南轻量级网络请求工具安全竞品和相关作品进一步探索 简介 curl&#xff08;Client for URLs&#xff09;是一款网络请求工具。 curl 于 1996 年首次发布。它最初被命名为 httpget 后更名为curl。 curl 常用于发送网络请求&#xff0c;它支持多种网…

一条sql是如何运行的

在我们平时使用sql的时候&#xff0c;基本是基于黑盒的使用方式&#xff0c;在客户端输入一条sql语句&#xff0c;然后回显想要的数据&#xff0c;对于mysql server端内部如何运行的以及与存储引擎如何交互的不得而知。 通过下面一幅图&#xff0c;大致描述客户端和服务端交互…

什么是VUE 创建第一个VUE实例

一、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架 Vue2官网&#xff1a;Vue.js 1.什么是构建用户界面 基于数据渲染出用户可以看到的界面 2.什么是渐进式 所谓渐进式就是循序渐进&#xff0c;不一定非得把Vu…

Android 基础技术——addView 流程

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于 addView 在了解 addView 流程之前&#xff0c;先回答下以下几个问题&#xff1a; PhoneWindow是什么时候创建的&#xff1f; DectorView 是什么&#xff1f; DectorView 是什么时候创建的&#xf…

ABS10-ASEMI智能LED灯具专用ABS10

编辑&#xff1a;ll ABS10-ASEMI智能LED灯具专用ABS10 型号&#xff1a;ABS10 品牌&#xff1a;ASEMI 封装&#xff1a;ABS-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;1A 功率(Pd)&#xff1a;50W 芯片个数&#xff1a;4 引脚数…

曲线生成 | 图解三次样条曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是样条&#xff1f;2 三次样条曲线原理2.1 曲线插值2.2 边界条件2.3 系数反解 3 算法仿真3.1 ROS C仿真3.2 Python仿真3.3 Matlab仿真 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细…