当前位置: 首页 > news >正文

JVM高级篇之GC

文章目录

  • 版权声明
  • 垃圾回收器的技术演进
  • Shenandoah
    • Shenandoah GC体验
    • Shenandoah GC循环过程
  • ZGC
    • ZGC简介
    • ZGC的版本更迭
    • ZGC体验&使用
    • ZGC的参数设置
    • ZGC的调优

版权声明

  • 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
  • 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
  • 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
  • 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规。
  • 本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。

垃圾回收器的技术演进

在这里插入图片描述

  • CMS会产生内存碎片:没有整理功能,会导致最终产生需要碎片,导致内存浪费
    在这里插入图片描述
  • 解决方案:
  1. 产生FULLGC并且进行整理,此时会产生长时间STW
  2. 退化成串行回收,产生长时间的STW

  • 新一代的垃圾回收器
    在这里插入图片描述
  • 不同的垃圾回收器设计的目标是不同的。Parallel GC、G1更注重较高的吞吐量;Shenandoah、ZGC更注重较低的延迟时间

在这里插入图片描述

Shenandoah

  • Shenandoah 是由Red Hat开发的一款低延迟的垃圾收集器,Shenandoah 并发执行大部分 GC 工作,包括并发的整理,堆大小对STW的时间基本没有影响。
  • Shenandoah GC文档
    在这里插入图片描述

Shenandoah GC体验

  • 可以使用docker构建Shenandoah GC体验
# Update the image to the most recent one:
$ docker pull shipilev/openjdk
$ docker pull shipilev/openjdk:17
$ docker pull shipilev/openjdk:11# Run the latest version:
$ docker run --rm -it shipilev/openjdk java -XX:+UseShenandoahGC -Xlog:gc -version
[0.007s][info][gc] Using Shenandoah
...# Run the JDK 17 version:
$ docker run --rm -it shipilev/openjdk:17 java -XX:+UseShenandoahGC -Xlog:gc -version
[0.007s][info][gc] Using Shenandoah
...# Run the JDK 11 version:
$ docker run --rm -it shipilev/openjdk:11 java -XX:+UseShenandoahGC -Xlog:gc -version
[0.008s][info][gc] Using Shenandoah
...

Shenandoah GC循环过程

在这里插入图片描述

GC(3) Pause Init Mark 0.771ms
GC(3) Concurrent marking 76480M->77212M(102400M) 633.213ms
GC(3) Pause Final Mark 1.821ms
GC(3) Concurrent cleanup 77224M->66592M(102400M) 3.112ms
GC(3) Concurrent evacuation 66592M->75640M(102400M) 405.312ms
GC(3) Pause Init Update Refs 0.084ms
GC(3) Concurrent update references  75700M->76424M(102400M) 354.341ms
GC(3) Pause Final Update Refs 0.409ms
GC(3) Concurrent cleanup 76244M->56620M(102400M) 12.242ms
  • 这些阶段大致执行以下操作:
  1. Init Mark(初始化标记)启动并发标记。它为堆和应用程序线程准备并发标记,然后扫描根集。这是周期中的第一次暂停,最主要的时间消耗者是根集扫描。因此,其持续时间依赖于根集的大小。
  2. Concurrent Marking(并发标记)遍历堆,并追踪可达对象。这个阶段与应用程序并行运行,其持续时间取决于堆中活跃对象的数量和对象图的结构。由于应用程序在此阶段可以自由分配新数据,因此堆占用率在并发标记期间上升。
  3. Final Mark(最终标记)通过排空所有待处理的标记/更新队列并重新扫描根集来完成并发标记。它还通过确定要疏散的区域(收集集)、预先疏散一些根,并通常为下一个阶段准备运行时来初始化疏散。这部分工作可以在Concurrent Precleaning(并发预清理)阶段并发完成。这是周期中的第二次暂停,这里最主要的时间消耗者是排空队列和扫描根集。
  4. Concurrent Cleanup(并发清理)回收即时垃圾区域——即,并发标记后检测到没有活跃对象存在的区域。
  5. Concurrent Evacuation(并发疏散)将对象从收集集复制到其他区域。这是与其他OpenJDK GCs的主要区别。这个阶段再次与应用程序并行运行,因此应用程序可以自由分配。其持续时间取决于本周期选择的收集集的大小。
  6. Init Update Refs(初始化更新引用)启动更新引用阶段。它几乎不做任何事情,只确保所有GC和应用程序线程已完成疏散,然后为下一个阶段准备GC。这是第三次暂停,也是所有中最短的。
  7. Concurrent Update References(并发更新引用)遍历堆,并更新在并发疏散期间移动的对象的引用。这是与其他OpenJDK GCs的主要区别。其持续时间取决于堆中的对象数量,但不依赖于对象图的结构,因为它是线性扫描堆的。这个阶段与应用程序并行运行。
  8. Final Update Refs(最终更新引用)通过重新更新现有根集来完成更新引用阶段。它还回收收集集中的区域,因为现在堆不再有对那些(过时的)对象的引用。这是周期中的最后一次暂停,其持续时间取决于根集的大小。
    9。 Concurrent Cleanup(并发清理)回收现在没有引用的收集集区域。

ZGC

ZGC简介

  • ZGC 是一种可扩展的低延迟垃圾回收器。ZGC 在垃圾回收过程中,STW的时间不会超过一毫秒,适合需要低延迟的应用。支持几百兆到16TB 的堆大小,堆大小对STW的时间基本没有影响。
  • ZGC降低了停顿时间,能降低接口的最大耗时,提升用户体验。但吞吐量不佳,所以如果服务关注QPS(每秒的查询次数)G1是比较不错的选择。
    在这里插入图片描述

ZGC的版本更迭

在这里插入图片描述

ZGC体验&使用

  • OracleJDK和OpenJDK中都支持ZGC,阿里的DragonWell龙井JDK也支持ZGC但属于其自行对OpenJDK 11的
    ZGC进行优化的版本。

  • 【建议使用JDK17之后的版本,延迟较低同时无需手动配置并行线程数。】

  • 分代 ZGC添加如下参数启用 -XX:+UseZGC -XX:+ZGenerational

  • 非分代 ZGC通过命令行选项启用 -XX:+UseZGC

  • 使用 adoptopenjdk:17 作为基础镜像,进行体验,创建名称为Dockerfile的普通文本文件

#使用adoptopenjdk作为基础镜像,选择Java 17版本
FROM adoptopenjdk:17-jdk-hotspot#设置工作目录
WORKDIR /app#拷贝应用程序jar包到镜像中
COPY target/your-application.jar /app/your-application.jar#暴露应用程序的端口(如果需要)
EXPOSE 8080#设置启动命令,指定使用ZGC作为垃圾收集器
CMD ["java", "-XX:+UseZGC", "-jar", "your-application.jar"]
  1. 构建 Docker 镜像并运行容器, 并配置 ZGC 的 Java 应用程序
docker build -t your-image-name .
docker run -d -p 8080:8080 your-image-name

ZGC的参数设置

  • ZGC在设计上做到了自适应,根据运行情况自动调整参数,让用户手动配置的参数最少化。
    • 自动设置年轻代大小,无需设置-Xmn参数。
    • 自动晋升阈值(复制中存活多少次才搬运到老年代),无需设置-XX:TenuringThreshold
    • JDK17之后支持自动的并行线程数,无需设置-XX:ConcGCThreads
  • 需要设置的参数:
    -Xmx 值 (最大堆内存大小):ZGC最重要的一个参数,必须设置。ZGC在运行过程中会使用一部分内存用来处理垃圾回收,所以尽量保证堆中有足够的空间。设置多少值取决于对象分配的速度,根据测试情况来决定。
  • 可以设置的参数:
    -XX:SoftMaxHeapSize=值:ZGC会尽量保证堆内存小于该值,在内存靠近这个值时会尽早地进行垃圾回收,但是依然有可能会超过该值。例如,-Xmx5g -XX:SoftMaxHeapSize=4g ZGC会尽量保证堆内存小于4GB,最多不会超过5GB。

ZGC的调优

  • ZGC 中可以使用Linux的Huge Page大页技术优化性能,提升吞吐量、降低延迟。
  • 注意:安装过程需要 root 权限,所以ZGC默认没有开启此功能。

操作步骤:

  1. 计算所需页数,Linux x86架构中大页大小为 2 M B 2MB 2MB,根据所需堆内存的大小估算大页数量。比如堆空间需要 16 G 16G 16G,预留 2 G 2G 2G(JVM需要额外的一些非堆空间),那么页数就是 18 G / 2 M B = 9216 18G / 2MB = 9216 18G/2MB=9216
  2. 配置系统的大页池以具有所需的页数(需要root权限):
$ echo 9216 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
  1. 添加参数 − X X : + U s e L a r g e P a g e s -XX:+UseLargePages XX:+UseLargePages 启动程序进行测试

相关文章:

JVM高级篇之GC

文章目录 版权声明垃圾回收器的技术演进ShenandoahShenandoah GC体验Shenandoah GC循环过程 ZGCZGC简介ZGC的版本更迭ZGC体验&使用ZGC的参数设置ZGC的调优 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马…...

第十四届蓝桥杯省赛大学C组(C/C++)三国游戏

原题链接:三国游戏 小蓝正在玩一款游戏。 游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X,Y,Z(一开始可以认为都为 0)。 游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时…...

java之static详细总结

static也叫静态,可以修饰成员变量、成员方法。 成员变量 按照有无static分为两种: 类变量:static修饰,属于类,与类一起加载一次,在内存中只有一份,会被类的全部对象共享实例变量(…...

RabbitMQ3.13.x之六_RabbitMQ使用场景

RabbitMQ3.13.x之六_RabbitMQ使用场景 文章目录 RabbitMQ3.13.x之六_RabbitMQ使用场景1. 为什么选择 RabbitMQ?1. 可互操作2. 灵活3. 可靠 2. 常见用户案例1. 服务解耦2. 远程过程调用3. 流处理4. 物联网 1. 为什么选择 RabbitMQ? RabbitMQ 是一个可靠且…...

C++ 类和对象(初篇)

类的引入 C语言中,结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式: class className {// 类体:由成员函…...

微软推出GPT-4 Turbo优先使用权:Copilot for Microsoft 365商业用户享受无限制对话及增强图像生成能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

Spring Boot Actuator

概述 Spring Boot Actuator是Spring Boot的一个功能模块,用于提供生产环境中常见的监控和管理功能。它提供了各种端点(endpoints),可以用于监视应用程序的运行状况、收集应用程序的指标数据以及与应用程序进行交互。 以下是Spri…...

我与C++的爱恋:类与对象(一)

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 ​C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C是基于面向对象的,关注的是对象&…...

os模块篇(十八)

文章目录 os._exit(n)os.forkpty()os.kill(pid, sig, /)os.killpg(pgid, sig, /)os.nice(increment, /)os.pidfd_open(pid, flags0)os.plock(op, /)os.popen(cmd, moder, buffering-1)os.posix_spawn(path, argv, env, *, file_actionsNone, setpgroupNone, resetidsFalse, set…...

Oracle 数据库工作中常用知识点:sql语法与常用函数

.to_date()函数 to_date函数是Oracle特有的函数,该函数用来做日期转换。 举例: SELECT TO_DATE(‘2006-05-01 19:25:34’, ‘YYYY-MM-DD HH24:MI:SS’) FROM DUAL   日期格式:     YYYY、YYY、YY 分别代表4位、3位、2位的数字年    …...

软件工程

开发模型 瀑布模型 用于结构化模型开发 适用需求明确或者二次开发 原型模型 适用需求不明确 演化模型 增量模型 适用需求不明确 先做一块,再做一块,这样不断的对核心功能的审视,降低风险 螺旋模型 由多个模型组合成 适用需求不明…...

【御控物联】JavaScript JSON结构转换(17):数组To对象——键值互换属性重组

文章目录 一、JSON结构转换是什么?二、核心构件之转换映射三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…...

免注册,ChatGPT可即时访问了!

AI又有啥进展?一起看看吧 Apple进军个人家用机器人 Apple在放弃自动驾驶汽车项目并推出混合现实头显后,正在进军个人机器人领域,处于开发家用环境机器人的早期阶段 报告中提到了两种可能的机器人设计。一种是移动机器人,可以跟…...

探索未来游戏:生成式人工智能AI如何重塑你的游戏世界?

生成式人工智能(Generative AI)正以前所未有的速度改变着各行各业的运作模式。其中,游戏产业作为科技应用的前沿阵地,正经历着前所未有的变革。本文将探讨生成式人工智能如何重塑游戏产业,以及这一变革背后的深远影响。…...

ubuntu23设置kibana后台启动服务

要在Ubuntu 23系统中设置Kibana作为系统服务,以便能够通过systemd管理其启动、停止、重启以及设置开机自动启动,可以按照以下步骤操作: 1. 创建Kibana systemd服务单元 创建一个名为kibana.service的文件在 /etc/systemd/system/ 目录下&am…...

身份证实名制、C#身份核验代码示例、身份证查询

在以前,企业采用人工审核的方式对线上用户进行身份信息真伪的核验,在用户上传身份信息后,人工进行后台审核,虽能满足企业对用户实名认证的需求,但效率慢、耗时长,且存在一定的人为误差,对高度PS…...

【leetcode面试经典150题】15.分发糖果(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…...

Elasticsearch如何选择版本

不同版本的ES差异非常大,包括不局限于ES语法、架构、API、集群搭建等等。这些差异足以导致不同版本是否能满足你的业务场景以及后续开发维护成本等各种问题。 先说结论,以个人实践经验及综合考虑推荐使用 7.x 版本中的 7.10版本 ES版本对比 以下是通过…...

P8749 [蓝桥杯 2021 省 B] 杨辉三角形

[蓝桥杯 2021 省 B] 杨辉三角形 题目描述 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1 , 1 , 1 , 1 , 2 , 1 , 1 , 3 , 3 , 1 , 1 , 4 , 6 , 4 , 1 , … 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1, …...

MySQL数据库——1.创建数据库

在 MySQL 数据库中,要创建一个新的数据库,可以使用 SQL 命令 CREATE DATABASE。创建数据库是管理数据的第一步,它提供了一个容器,用于存储表、视图、存储过程等数据库对象。 示例: CREATE DATABASE my_database; 在…...

计算机视觉研究院 | Drone-YOLO:一种有效的无人机图像目标检测

本文来源公众号“计算机视觉研究院”,仅用于学术分享,侵权删,干货满满。 原文链接:Drone-YOLO:一种有效的无人机图像目标检测 无人机图像中的目标检测是各个研究领域的重要基础。然而,无人机图像带来了独…...

[C#]使用OpencvSharp去除面积较小的连通域

【C介绍】 关于opencv实现有比较好的算法,可以参考这个博客OpenCV去除面积较小的连通域_c#opencv 筛选小面积区域-CSDN博客 但是没有对应opencvsharp实现同类算法,为了照顾懂C#编程同学们,因此将 去除面积较小的连通域算法转成C#代码。 方…...

联邦学习目前面临的挑战以及解决方案

学习目标: 联邦学习目前面临的挑战以及解决方案 学习内容: 联邦学习是一种新兴的人工智能基础技术,它在保障大数据交换时的信息安全、保护终端数据和个人数据隐私、保证合法合规的前提下,在多参与方或多计算结点之间开展高效率的…...

Day60:WEB攻防-XMLXXE安全无回显方案OOB盲注DTD外部实体黑白盒挖掘

目录 XML&XXE-传输-原理&探针&利用&玩法 XXE 黑盒发现 XXE 白盒发现 XXE修复防御方案 有回显 无回显 XML&XXE-黑盒-JSON&黑盒测试&类型修改 XML&XXE-白盒-CMS&PHPSHE&无回显 知识点: 1、XXE&XML-原理-用途&…...

解锁网络安全新境界:雷池WAF社区版让网站防护变得轻而易举!

网站运营者的救星:雷池WAF社区版 ️ 嘿朋友们!今天我超级激动要跟你们分享一个神器——雷池WAF社区版。这个宝贝对我们这帮网站运营者来说,简直就是保护伞! 智能语义分析技术:超级侦探上线 先说说为啥我这么稀饭它。雷…...

RabbitMQ安装详细教程

(一)在Windows系统上安装Erlang的步骤如下: 打开Erlang的官方下载页面,选择适合你的Windows系统的版本进行下载。 下载完成后,双击运行下载的.exe文件,进入Erlang的安装向导。 在安装向导中,按…...

如何快速写出一个完整的测试用例

测试用例是为了验证软件功能或需求而设计的一组测试输入、执行条件和预期结果。编写测试用例的目的是确保测试过程全面高效、有据可查。 一般来说,编写测试用例的流程包括以下几个步骤: 分析需求:阅读需求文档,理解软件的功能和业…...

Docker容器与虚拟化技术:OpenEuler 部署 ES 与 Kibana

目录 一、实验 1.环境 2.OpenEuler 部署 ES (EalasticSearch) 3.OpenEuler 部署 Kibana 4.部署 Elasticvue插件 5.使用cpolar内网穿透 6.使用Elasticvue 一、实验 1.环境 (1)主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 1…...

数学中的各种符号虚数概念

max i∈S​A i ​ ≥ ∑ i∈S​B i​. 这个不等式表达的意思是对于集合 S 中的任意非空子集,子集中的最大的 A_i(A 的元素)的值都大于等于子集中所有 B_i(B 的元素)的值的总和。换句话说,集合 S 中的最大…...

什么是中间件

中间件是指在应用程序与操作系统之间提供服务的软件,它可以隐藏底层操作系统的复杂性,为应用程序提供各种实用的服务,以便应用程序更好地实现业务逻辑。中间件通常提供如下几种服务: 数据库连接:中间件可以为应用程序提…...

使用dw如何给网站做电影/得物app的网络营销分析论文

Description: 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容…...

企业1级域名网站怎么做/深圳网

在您的示例数据集上,以下工作:In [35]:df.iloc[0:df[df.year y3].index[0]]Out[35]:year col10 y1 val_11 y1 val_22 y1 val_33 y2 val_44 y2 val_55 y2 val_6所以打破这个,我们执行一个布尔索引来查找等于年值的行:In [36]:df[df.year y3]Out[36]:yea…...

wordpress页面tab/爱采购seo

在业务系统中常常使用回车键(Enter)替代Tab键完成焦点跳转,在uniGUI下,可以不用代码,直接使用TUniForm的NavigateKeys进行设置: 其中Next和Prior决定了焦点向下一个和前一个跳转的按键 Key = 13 表示Enter ShiftStete 表示辅助键(Shift、Alt或Ctrl)按下状态,当二者结…...

100个免费网页设计模板/重庆做网络优化公司电话

USB4系统结构由USB4主机,USB4集线器和USB4功能设备这3部分组成。USB4主机可以是支持USB4的笔记本和平板等,至少需要一个USB Type-C接口,支持USB 3.2数据传输,PCIe数据传输和DisplayPort视频信号传输。USB4集线器是一个USB4接口扩展…...

沧州好的做网站的公司/网站营销网站营销推广

2019独角兽企业重金招聘Python工程师标准>>> Chrome 47以后,getUserMedia API只能允许来自“安全可信”的客户端的视频音频请求,如HTTPS和本地的Localhost。 例如:https://192.168.1.2:8080…localhost是唯一不用https的域名。因此…...

做网站的要求/百度收录提交入口网址是什么

参考:http://blog.csdn.net/eriato/article/details/41039985 http://blog.sina.com.cn/s/blog_71247658010183j6.html (大概摘一些,,,,重点是了解这概念,用法可以慢慢找) 索引视图 …...