JVM高级篇之GC

news2024/11/28 20:53:44

文章目录

  • 版权声明
  • 垃圾回收器的技术演进
  • 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 启动程序进行测试

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

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

相关文章

Vue - 你知道Vue中computed和watch的区别吗

难度级别:中高级及以上 提问概率:70% 二者都是用来监听数据变化的,而且在日常工作中大部分时候都只是局限于简单实用,所以到了面试中很难全面说出二者的区别。接下来我们看一下,二者究竟有哪些区别呢? 先说computed,它的主要用途是监听…

Java中网络编程,Junit单元测试详解

文章目录 软件结构C/S结构B/S结构 概述三要素IP (银行的位置)端口 (银行中某个柜台号)协议 (填写取款单的规则)TCP通信程序TCP通信原理客户端发送数据服务端接收数据过程图三次握手 Junit单元测试概述常见的注解使用断言概述使用 软件结构 C/S结构 客户…

Windows深度学习环境----Cuda version 10.2 pytorch3d version 0.3.0

Requirements Python version 3.8.5Pytorch version: pytorch1.6.0 torchvision0.8.2 torchaudio0.7.0 cudatoolkit10.2.89pytorch3d version 0.3.0Cuda version 10.2 感觉readme文件里的不适配,跟pytorch官网不同 以前的 PyTorch 版本 |PyTorch的 # CUDA 10.2 c…

HDLbits 刷题 --Popcount255

A "population count" circuit counts the number of 1s in an input vector. Build a population count circuit for a 255-bit input vector. 译: 一个“population count”电路用于计算输入向量中1的数量。为一个255位的输入向量构建一个人口计数电路…

【免费使用AI工具】国内AI网站集合

文章目录 文心一言腾讯混元助手讯飞星火认知大模型:文心一格(绘图)云雀大模型(文本对话)智谱AI:(GLM大模型)百川智能(百川大模型)MiniMax(ABAB大模型)万维天工ChatGPT3.5镜像网站通义千问文心一言 https://yiyan.baidu.com/ 腾讯混元助手 微信搜索【腾讯混元助手】小…

金蝶BI方案的报表,主打做得快、易理解

金蝶做数据分析报表慢、步骤多、数据不够直观?但奥威-金蝶BI方案的报表就不一样了,不仅做得快,还十分好理解,因为它做出来的是随时可以按需自助的BI智能数据可视化分析报表。 有多快? 注册奥威BI SaaS平台&#xff0…

提升Python网络编程效率:深入学习furl库

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 furl 是一个 Python 库,用于处理 URL。它提供了一个简洁而强大的接口,用于构建、解析和操作 URL。本文章介绍下 furl 库的使用。 &a…

01 _ 分布式缘何而起:从单兵,到游击队,到集团军

这里先来聊聊什么是分布式。 与其直接用些抽象、晦涩的技术名词去给分布式下一个定义,还不如从理解分布式的发展驱动因素开始,我们一起去探寻它的本质,自然而然地也就清楚它的定义了。 这里将介绍分布式的起源,是如何从单台计算…

申请专利有用吗 好处

申请专利:一项值得考虑的策略 随着科技的快速发展和市场竞争的日益激烈,创新成为了企业或个人取得竞争优势的关键。在这样的背景下,申请专利成为了许多创新者保护自己创意和技术的重要手段。 申请专利真的有用吗? 申请专利可以…

Golang学习笔记

Golang学习笔记 安装Golang 来源:linux 安装 golang - 知乎 (zhihu.com) 由于我用的是linux系统,所以本文采用linux的安装方式介绍,如果你使用的是Windows/Mac 也可以看下该文章,或者自己去下列地址进行操作。 Download and in…

python--面向对象的三大特征---封装、继承、多态

1.封装: 1,在面向对象中,封装指的是一种安全机制,不让外界修改或者直接操作,将属性私有化; 如果要访问属性,提供公开的方法(getter,setter) 2. python的类如…

【Mybatis】Mybatis 二级缓存全详解教程

【Mybatis-Plus】Mybatis-Plus 二级缓存全详解 一,Mybatis-Plus介绍 MyBatis-Plus(简称MP)是一个基于 MyBatis 的增强工具,它简化了 MyBatis 的开发,并且提供了许多便利的功能,帮助开发者更高效地进行持久…

基于java+springboot+vue实现的健身房管理系统(文末源码+Lw)23-223

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装健身房管理系统软件来发挥其高效地信息处理的作用&#xf…

如何实现无感刷新(附前后端实现)?

无感刷新的核心思路: 无感刷新机制的目的是在用户不知情的情况下,自动更新其认证令牌(通常是Access Token),以保证用户的会话不会中断。这通常涉及到两种类型的令牌: Access Token:它是用户进行…

C++:if语句(20)

介绍 c最基本的三种程序运行模式为:顺序执行,判断执行,循环执行 顺序执行:前面我们的代码都是从上往下,依次执行的,这就是按顺序依次执行 判断执行:通过我们写的判断条件,去判断要不…

算法:完全背包问题dp

文章目录 一、完全背包问题的特征二、定义状态三、状态转移四、降维优化五、参考例题5.1、Acwing:3.完全背包问题5.2、Acwing:900. 整数划分 一、完全背包问题的特征 完全背包问题是动态规划中的一种经典问题,它的主要特征可以总结如下&…

重学SpringBoot3-事件与监听器

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-事件与监听器 事件和监听器的基本概念Spring Boot中的事件类型1. ApplicationStartingEvent2. ApplicationEnvironmentPreparedEvent3. ApplicationCont…

【InternLM 实战营第二期笔记】使用茴香豆搭建你的RAG智能助理

RAG RAG是什么 RAG(Retrieval Augmented Generation)技术,通过检索与用户输入相关的信息片段,并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追…

2024年阿里云优惠券(代金券)在哪里领取?

阿里云作为国内领先的云计算服务提供商,不仅提供了稳定、高效的云服务,还时常推出各种优惠活动,以此来吸引用户上云。其中,阿里云优惠券就是一种常见的优惠方式。那么,在2024年,我们该如何领取阿里云优惠券…

在自定义数据集上微调 YOLOv9 模型

在自定义数据集上微调 YOLOv9模型可以显着提高目标检测性能,但这种改进有多显着呢?在这次全面的探索中,YOLOv9在SkyFusion数据集上进行了微调,分为三个不同的类别:飞机、船舶和车辆。通过一系列广泛的实验,包括修改学习率、图像大小和战略性冻结主干网,已经实现了令人印…