JAVA虚拟机实战篇之GC调优[1](GC调优基知、方法、工具和常见GC模式)

文章目录

  • 版权声明
  • GC调优概念
  • GC调优核心指标(KPI)
    • 吞吐量
    • 延迟(Latency)
    • 内存使用量
  • GC调优方法
    • GC调优步骤
    • GC调优工具
      • jstat工具
      • visualvm插件
      • Prometheus + Grafana
  • GC日志分析
    • GC日志保存
    • GC日志分析工具
    • GC Viewer
    • GCeasy
  • 常见的GC模式
    • 正常情况
    • 缓存对象过多情况
    • 内存泄漏情况
    • 持续FullGC情况
    • 元空间不足导致FULLGC情况

版权声明

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

GC调优概念

  • GC调优指的是对垃圾回收(Garbage Collection)进行调优。GC调优的主要目标是避免由垃圾回收引起程序性能下降

GC调优的核心分成三部分:

  1. 通用Jvm参数的设置
  2. 特定垃圾回收器的Jvm参数的设置。
  3. 解决由频繁的FULLGC引起的程序性能问题
  • GC调优没有没有唯一的标准答案,如何调优与硬件、程序本身、使用情况均有关系,重点调优的工具和方法

GC调优核心指标(KPI)

  • 判断GC是否需要调优,需要从吞吐量、延迟和内存使用量来考虑

吞吐量

  • 吞吐量(Throughput) :业务吞吐量和垃圾回收吞吐量。
  1. 业务吞吐量指的在一段时间内,程序需要完成的业务数量。比如企业中对于吞吐量的要求可能会是这样的:支持用户每天生成10000笔订单;在晚上8点到10点,支持用户查询50000条商品信息。
    • 保证高吞吐量的常规手段: 一 优化业务执行性能,减少单次业务的执行时间;二 优化垃圾回收吞吐量
  2. 垃圾回收吞吐量指的是 CPU 用于执行用户代码的时间与 CPU 总执行时间的比值,即 吞吐量 = 执行用户代码时间 / (执行用户代码时间 + G C 时间) 吞吐量 = 执行用户代码时间 /(执行用户代码时间 + GC时间) 吞吐量=执行用户代码时间/(执行用户代码时间+GC时间)
    • 吞吐量数值越高,垃圾回收的效率就越高,允许更多的CPU时间去处理用户的业务,相应的业务吞吐量也就越高。
      在这里插入图片描述
  • 如下图,gceasy分析工具给出的吞吐量(较差)
    在这里插入图片描述

延迟(Latency)

  • 延迟指的是从用户发起一个请求到收到响应这其中经历的时间。 延迟 = G C 延迟 + 业务执行时间 延迟 = GC延迟 + 业务执行时间 延迟=GC延迟+业务执行时间,如果GC时间过长,会影响到用户的使用
    在这里插入图片描述
  • 如下图,gceasy分析工具给出的延迟(较差)
    在这里插入图片描述

内存使用量

  • 内存使用量指Java应用占用系统内存的最大值,一般通过Jvm参数调整,在满足上述两个指标的前提下,值越小越好
    在这里插入图片描述

GC调优方法

GC调优步骤

在这里插入图片描述

GC调优工具

jstat工具

  • Jstat工具是JDK自带的一款监控工具,可以提供各种垃圾回收、类加载、编译信息等不同的数据。
  • 优点:操作简单、无需额外的软件
  • 缺点:无法准确到GC产生的时间、只能用于判断GC是否存在问题
参数含义
S0C年轻代中第一个幸存区的容量(KB) (Survivor 0 Capacity)
S1C年轻代中第二个幸存区的容量(KB) (Survivor 1 Capacity)
S0U年轻代中第一个幸存区已使用的空间(KB) (Survivor 0 Used)
S1U年轻代中第二个幸存区已使用的空间(KB) (Survivor 1 Used)
EC年轻代中Eden区的容量(KB) (Eden Capacity)
EU年轻代中Eden区已使用的空间(KB) (Eden Used)
OC老年代的容量(KB) (Old Capacity)
OU老年代已使用的空间(KB) (Old Used)
MC方法区(Metaspace)的容量(KB) (Metaspace Capacity)
MU方法区已使用的空间(KB) (Metaspace Used)
CCSC压缩类空间的容量(KB) (Compressed Class Space Capacity)
CCSU压缩类空间已使用的空间(KB) (Compressed Class Space Used)
YGC年轻代垃圾回收的次数 (Young Generation Garbage Collection Count)
YGCT年轻代垃圾回收所花费的时间(秒) (Young Generation GC Time)
FGC老年代垃圾回收的次数 (Full GC Count)
FGCT老年代垃圾回收所花费的时间(秒) (Full GC Time)
CGC压缩类空间垃圾回收的次数 (Compressed Class Space GC Count)
CGCT压缩类空间垃圾回收所花费的时间(秒) (Compressed Class Space GC Time)
GCT总的垃圾回收时间(秒) (Total GC Time)
  • 使用方法为:jstat -gc 进程ID 每次统计的间隔(毫秒) 统计次数
C:\Users\HP>jps
20224
724 JpsC:\Users\HP>jstat -gc 20224 1000 5
S0C         S1C         S0U         S1U          EC           EU           OC           OU          MC         MU       CCSC      CCSU     YGC     YGCT     FGC    FGCT     CGC    CGCT       GCT
0.0      2048.0         0.0      1589.7     378880.0     208896.0     653312.0     456939.0   375360.0   371249.6   50944.0   49257.5     41     0.321     0     0.000    26     0.122     0.443
0.0      2048.0         0.0      1589.7     378880.0     217088.0     653312.0     456939.0   375360.0   371249.6   50944.0   49257.5     41     0.321     0     0.000    26     0.122     0.443
0.0      2048.0         0.0      1589.7     378880.0     227328.0     653312.0     456939.0   375360.0   371249.6   50944.0   49257.5     41     0.321     0     0.000    26     0.122     0.443
0.0      2048.0         0.0      1589.7     378880.0     235520.0     653312.0     456939.0   375360.0   371249.6   50944.0   49257.5     41     0.321     0     0.000    26     0.122     0.443
0.0      2048.0         0.0      1589.7     378880.0     243712.0     653312.0     456939.0   375360.0   371249.6   50944.0   49257.5     41     0.321     0     0.000    26     0.122     0.443

visualvm插件

  • VisualVm中提供了一款Visual Tool插件,实时监控Java进程的堆内存结构、堆内存变化趋势以及垃圾回收时间的变化趋势
  • 优点:适合开发使用,能直观观察堆内存和GC的变化趋势
  • 缺点:对程序运行性能具有一定影响,生产环境程序员没有权限进行操作
    在这里插入图片描述
  • visual安装visual GC插件步骤如图
    在这里插入图片描述
    在这里插入图片描述

Prometheus + Grafana

  • Prometheus+Grafana是企业中运维常用的监控方案,其中Prometheus用来采集系统或者应用的相关数据,同时具备告警功能。Grafana可以将Prometheus采集到的数据以可视化的方式进行展示。
  • 优点:支持系统级别和应用级别的监控,比如linux操作系统、Redis、MySQL、Java进程;支持告警并允许自定义告警指标,通过邮件、短信等方式尽早通知相关人员进行处理
  • 缺点:环境搭建较为复杂,一般由运维人员完成

GC日志分析

  • 通过GC日志,可以更好的看到垃圾回收细节上的数据,同时也可以根据每款垃圾回收器的不同特点更好地发现存在的问题。

GC日志保存

  • JDK 8及以下:-XX:+PrintGCDetails -Xloggc:文件名
  • JDK 9+:-Xlog:gc*:file=文件名

GC日志分析工具

GC Viewer

  • GCViewer是一个将GC日志转换成可视化图表的小工具,github地址
  • 使用方法:java -jar gcviewer.jar 日志文件.log

GCeasy

  • GCeasy是一款用于分析Java应用程序的垃圾回收日志的工具。通过分析GC日志,GCeasy可以展示垃圾回收的统计信息、内存使用情况、GC停顿时间等关键指标,帮助开发人员更好地优化其应用程序的性能。
  • GCeasy的官方网站https://gceasy.io/
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

常见的GC模式

正常情况

  • 特点:呈现锯齿状,对象创建之后内存上升,一旦发生垃圾回收之后下降到底部,并且每次下降之后的内存大小接近,存留的对象较少
    在这里插入图片描述

缓存对象过多情况

  • 特点:呈现锯齿状,对象创建之后内存上升,一旦发生垃圾回收之后下降到底部,并且每次下降之后的内存大小接近,处于比较高的位置。
  • 问题产生原因: 程序中保存大量的缓存对象,导致GC之后无法释放,可以使用MAT或者HeapHero等工具进行分析内存占用的原因。
    在这里插入图片描述

内存泄漏情况

  • 特点:呈现锯齿状,每次垃圾回收之后下降到的内存位置越来越高,最后由于垃圾回收无法释放空间导致对象无法分配产生OutOfMemory的错误。
  • 问题产生原因: 程序中保存大量的内存泄漏对象,导致GC之后无法释放,可以使用MAT或者HeapHero等工具进行分析是哪些对象产生了内存泄漏。
    在这里插入图片描述

持续FullGC情况

  • 特点:在某个时间点产生多次Full GC,CPU使用率同时飙高,用户请求基本无法处理。一段时间之后恢复正常。
  • 问题产生原因: 在该时间范围请求量激增,程序开始生成更多对象,同时垃圾收集无法跟上对象创建速率,导致持续地在进行FULL GC
  • GCeasy文档报告地址
    在这里插入图片描述

元空间不足导致FULLGC情况

  • 特点:堆内存的大小并不是特别大,但是持续发生FULLGC。
  • 问题产生原因: 元空间大小不足,导致持续FULLGC回收元空间的数据
  • GCeasy文档报告地址
    在这里插入图片描述

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

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

相关文章

01_electron入门

由于毕业论文可能需要用 electron,所以 Linux 驱动学习慢了下来。 一、安装 node.js 进入 node.js 官网:Node.js (nodejs.org) 咱们就是用稳定版,安装包除了安装路径自己选择外,一直点 Next。 安装完成后需要配置环境&#xff0c…

如有Kata

养成跑步的习惯,就能习惯性跑步,一有空就见缝插针抽空跑步。这是一层韵律感、完成感、美感、成就感。而一次跑步的一连串动作,是另一层韵律感、完成感、美感、成就感。所以这里就有了两层的韵律感、完成感、美感、成就感。如是如水漂荡漾。健…

动手做一个最小RAG——TinyRAG

Datawhale干货 作者:宋志学,Datawhale成员 大家好,我是不要葱姜蒜。 接下来我会带领大家一步一步地实现一个简单的RAG模型,这个模型是基于RAG的一个简化版本,我们称之为Tiny-RAG。Tiny-RAG是一个基于RAG的简化版本&am…

SpringBoot源码

SpringBoot核心前置内容 1.Spring注解编程的发展过程 1.1 Spring 1.x 2004年3月24日,Spring1.0 正式发布,提供了IoC,AOP及XML配置的方式。 在Spring1.x版本中提供的是纯XML配置的方式,也就是在该版本中必须要提供xml的配置文件…

八、词嵌入语言模型(Word Embedding)

词嵌入(Word Embedding, WE),任务是把不可计算、非结构化的词转换为可以计算、结构化的向量,从而便于进行数学处理。 一个更官方一点的定义是:词嵌入是是指把一个维数为所有词的数量的高维空间(one-hot形式…

小迪安全36WEB 攻防-通用漏洞XSS 跨站MXSSUXSSFlashXSSPDFXSS

#XSS跨站系列内容:1. XSS跨站-原理&分类&手法 XSS跨站-探针&利用&审计XSS跨站另类攻击手法利用 XSS跨站-防御修复&绕过策略 #知识点: 1、XSS 跨站-原理&攻击&分类等 2、XSS 跨站-MXSS&UXSS&FlashXss&PDFXSS 等 1、原…

HCS-华为云Stack-计算节点内部网络结构

HCS-华为云Stack-计算节点内部网络结构 图中表示的仅为计算节点是两网口的模式,如果是四网口模式,系统会再自动创建一个网桥出来 图中未画出存储平面和Internal Base平面,它们和tunnel bearing、External OM-样,都是通过trunk0的…

信息系统项目管理师006:车联网(1信息化发展—1.2现代化基础设施—1.2.3车联网)

文章目录 1.2.3 车联网1.体系框架2.链接方式3.场景应用 记忆要点总结 1.2.3 车联网 车联网是新一代网络通信技术与汽车、电子、道路交通运输等领域深度融合的新兴产业形态。智能网联汽车是搭载先进的车载传感器、控制器、执行器等装置,并融合现代通信与网络技术&…

Linux常用命令之top监测

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ 👀👀👀 个人博客:小奥的博客 👍👍👍:个人CSDN ⭐️⭐️⭐️:传送门 🍹 本人24应届生一枚,技术和水平有限&am…

for、while、do While、for in、forEach、map、reduce、every、some、filter的使用

for、while、do While、for in、forEach、map、reduce、every、some、filter的使用 for let arr [2, 4, 6, 56, 7, 88];//for for (let i 0; i < arr.length; i) {console.log(i : arr[i]) //0:2 1:4 2:6 3:56 4:7 5:88 }普通的for循环可以用数组的索引来访问或者修改…

SAP BTP Hyperscaler PostgreSQL都有哪些Performance监控 (一)

前言 SAP BTP云平台中&#xff0c;除了自身的HANA数据库作为首选以外&#xff0c;它还支持PostgreSQL的整套服务&#xff0c;并以PaaS的形式提供给客户。你可以按照实例为单位进行购买申请不同标准规格的PG实例&#xff0c;然后构建自己的业务逻辑。Hyperscaler是这套产品或方…

【Python-Docx库】Word与Python的完美结合

今天给大家分享Python处理Word的第三方库&#xff1a;Python-Docx。 什么是Python-Docx&#xff1f; Python-Docx是用于创建和更新Microsoft Word&#xff08;.docx&#xff09;文件的Python库。 日常需要经常处理Word文档&#xff0c;用Python的免费第三方包&#xff1a;Pyt…

【Linux】Shell及Linux权限

Shell Shell的定义 Shell最简单的定义是&#xff1a;命令行解释器。 Shell的主要任务&#xff1a;1. 将使用者的命令翻译给核心进行处理。2.将核心的处理结果翻译给使用者 为什么要有Shell? 使用者和内核的关系就相当于两个完全陌生的外国人之间的关系&#xff0c;他们要进…

Linux:线程互斥与同步

目录 线程互斥 锁的初始化 加锁 解锁 锁的初始化 锁的原理 死锁 线程同步 方案一&#xff1a;条件变量 条件变量初始化 等待 唤醒 条件变量的代码示例 基于阻塞队列的生产消费模型 方案二&#xff1a;POSIX信号量 初始化信号量&#xff1a; 销毁信号量 等待信…

中国大学生计算机设计大赛--智慧物流挑战赛基础

文章目录 一、Ubuntu基础1.1 基本操作1.2 文本编辑 二、ROS基础介绍2.1 概念与特点2.2 基本结构2.3 创建工程2.4 节点和节点管理器2.5 启动文件 三、ROS通信机制3.1 话题3.2 服务3.3 动作3.4 参数服务器 四、ROS可视化工具4.1 rviz4.2 rqt4.3 tf 五、Python实现简单的ROS节点程…

01-分析同步通讯/异步通讯的特点及其应用

同步通讯/异步通讯 微服务间通讯有同步和异步两种方式 同步通讯: 类似打电话场景需要实时响应(时效性强可以立即得到结果方便使用),而且通话期间不能响应其他的电话(不支持多线操作)异步通讯: 类似发邮件场景不需要马上回复并且可以多线操作(适合高并发场景)但是时效性弱响应…

MQ高可用相关设置

文章目录 前言MQ如何保证消息不丢失RabbitMQRocketMQKafkaMQ MQ如何保证顺序消息RabbitMQRocketMQKafka MQ刷盘机制/集群同步RabbitMQRocketMQKafka 广播消息&集群消息RabbitMQRocketMQ MQ集群架构RabbitMQRocketMQKafka 消息重试RabbitMQRockeMqKafka 死信队列RocketMQKaf…

Claude3横空出世:颠覆GPT-4,Anthropic与亚马逊云科技共启AI新时代

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

车载电子电器架构 —— 汽车电子电气系统分解

车载电子电器架构 —— 汽车电子电气系统分解 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何…

【操作系统概念】第14章:系统保护

文章目录 0. 前言14.1 保护目标14.2 保护原则14.3 保护域14.3.1 域结构14.3.2 实例&#xff1a;UNIX14.3.3 实例&#xff1a;MUTICS 14.4 访问矩阵14.5 访问矩阵的实现14.5.1 全局表14.5.2 对象的访问列表14.5.3 域的能力(权限)列表14.5.4 锁-钥匙机制*14.5.5 比较* 14.6 访问控…