GC日志分析

news2024/9/24 18:25:13

1.写在前面

前段时间一位读者面了阿里,在二面中被问到 GC 日志分析,感觉回答的不是很好,过来找我复盘,大致听了他的回答,虽然回答出了部分,但是没抓到重点。

GC 日志分析算是 JVM 调优中比较难的部分,今天这篇文章就来聊聊如何利用 JDK 现有的命令并且借助可视化工具如何去分析 GC 日志。

2.JVM 调优实践

2.1 JVM 实践调优主要步骤

默认的策略是最普用,但不是最佳的。

  • 第一步:监控分析 GC 日志

  • 第二步:判断 JVM 问题 :

    • 如果各项参数设置合理,系统没有超时日志出现,GC 频率不高,GC 耗时不高,那么没有必要进行 GC 优化

    • 如果 GC 时间超过 1-3 秒,或者频繁 GC,则必须优化。

  • 第三步:确定调优目标

  • 第四步:调整参数

    • 调优一般是从满足程序的内存使用需求开始,之后是时间延迟要求,最后才是吞吐量要求,要基于这个步骤来不断优化,每一个步骤都是进行下一步的基础,不可逆行之。

  • 第五步:对比调优前后差距

  • 第六步:重复:1 、 2 、 3 、 4 、 5 步骤

    • 找到最佳 JVM 参数设置

  • 第七步:应用 JVM 到应用服务器 :

    • 找到最合适的参数,将这些参数应用到所有服务器,并进行后续跟踪。

以上,就是我们进行 jvm 调优得一些步骤了。

那我们就从第一步开始喽!!!^_^

2.2 分析 GC 日志

2.2.1 初始参数设置

机器环境:

指标参数
机器CPU 12 核,内存 16GB
集群规模单机
seqb_web 版本1.0
数据库4 核 16G

Jvm 调优典型参数设置;

  1. -Xms 堆内存的最小值 :默认情况下,当堆中可用内存小于 40%时,堆内存会开始增加,一直增加到-Xmx 的大小。

  2. -Xmx 堆内存的最大值:默认值是总内存/64(且小于 1G),默认情况下,当堆中可用内存大于 70%时,堆内存会开始减少,一直减小到-Xms 的大小;

  3. -Xmn 新生代内存的最大值:包括 Eden 区和两个 Survivor 区的总和,配置写法如:-Xmn1024k,-Xmn1024m,-Xmn1g

  4. -Xss 每个线程的栈内存:默认 1M,一般来说是不需要改。线程栈越小意味着可以创建的线程数越多

整个堆的大小 = 年轻代大小 + 年老代大小,堆的大小不包含元空间大小,如果增大了年轻代,年老代相应就会减小,官方默认的配置为年老代大小/年轻代大小=2/1 左右;

建议在开发测试环境可以用 Xms 和 Xmx 分别设置最小值最大值,但是在线上生产环境,Xms 和 Xmx 设置的值必须一样,防止抖动;

这里比较重要喔,一般我们都是将 Xms 和 Xmx 的值设置为一样的!!!

JVM 调优设置合大小堆内存空间,既不能太大,也不能太小。那么应该设置为多少呢?

默认的配置是否存在性能瓶颈。如果想要确定 JVM 性能问题瓶颈,需要进一步分析GC 日志

  1. -XX:+PrintGCDetails 开启 GC 日志创建更详细的 GC 日志 ,默认情况下,GC 日志是关闭的

  2. -XX:+PrintGCTimeStamps,-XX:+PrintGCDateStamps :开启 GC 时间提示

    • 开启时间便于我们更精确地判断几次 GC 操作之间的时两个参数的区别

    • 时间戳是相对于 0 (依据 JVM 启动的时间)的值,而日期戳(date stamp)是实际的日期字符串

    • 由于日期戳需要进行格式化,所以它的效率可能会受轻微的影响,不过这种操作并不频繁,它造成的影响也很难被我们感知。

  3. -XX:+PrintHeapAtGC 打印堆的 GC 日志

  4. -Xloggc:./logs/gc.log 指定 GC 日志路径

这里,我们是在 windows 下面进行测试,idea 配置如下:

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:E:/logs/gc-default.log

这样就会在 e 盘下 logs 文件夹下面,生成 gc-default.log 日志

2.2.2 GC 日志解读

Young GC 日志含义

2022-08-05T13:45:23.336+0800: 4.866: [GC (Metadata GC Threshold) [PSYoungGen: 136353K->20975K(405504K)] 160049K->48437K(720384K), 0.0092260 secs] [Times: user=0.00 sys=0.02, real=0.02 secs]

这里的内容,我们一个一个解析:

2022-08-05T13:45:23.336+0800: 本次GC发生时间
4.866: 举例启动应用的时间
[GC【表示GC的类型,youngGC】 (Metadata GC Threshold) 元空间超阈值
[PSYoungGen: 136353K->20975K(405504K年轻代总空间)] 160049K->48437K(720384K)整堆), 0.0092260 secs本次垃圾回收耗时]
[Times: user=0.00本次GC消耗CPU的时间 sys=0.02系统暂停时间, real=0.02 secs实际应用暂停时间]

这里的解析,应该很详细了吧,还有谁看不懂的呢?

FullGC 日志含义

2022-08-05T20:24:47.815+0800: 6.955: [Full GC (Metadata GC Threshold) [PSYoungGen: 701K->0K(72704K)] [ParOldGen: 38678K->35960K(175104K)] 39380K->35960K(247808K), [Metaspace: 56706K->56706K(1099776K)], 0.1921975 secs] [Times: user=1.03 sys=0.00, real=0.19 secs]

这里的内容,我们也是一个一个解析:

2022-08-05T20:24:47.815+0800:
6.955: 刚启动服务就Full GC【整堆回收!!】

[Full GC (Metadata GC Threshold) Metaspace空间超限!
[PSYoungGen: 701K->0K(72704K)] 年轻代没有回收空间
[ParOldGen: 38678K->35960K(175104K)] 39380K->35960K(247808K), 老年代也没有到阈值,整堆更没有到阈值
[Metaspace: 56706K->56706K(1099776K)], 0.1921975 secs]
[Times: user=1.03本次GC消耗CPU的时间 sys=0.00系统暂停时间, real=0.19 secs实际应用暂停时间]

看到这里,有些哥们就会说,这么看,也太恶心了吧,密密麻麻的日志,看着头疼!!!

那么接下来我们来学一个 GC 日志可视化工具

2.2.3 GC 日志可视化分析

分析 GC 日志,就必须让 GC 日志输出到一个文件中,然后使用 GC 日志分析工具(gceasy.io/) 进行分析

这里分析完之后,可以下载分析报告

1) JVM 内存占用情况:

Generation【区域】Allocated【最大值】Peak【占用峰值】
Young Generation【年轻代】74.5 mb74.47 mb
Old Generation【老年轻代】171 mb95.62 mb
Meta Space【元空间】1.05 gb55.38 mb
Young + Old + Meta space【整体】1.3 gb212.64 mb

2) 关键性能指标:

image.png

1 、吞吐量:百分比越高表明 GC 开销越低。这个指标反映了 JVM 的吞吐量。

  • Throughput97.043%

2 、GC 延迟Latency

  • Avg Pause GC Time:7.80 ms 平均 GC 暂停时间

  • Max Pause GC Time:190 ms 最大 GC 暂停时间

3) GC 可视化交互聚合结果

由上图可以看到,发生了 3 次 full gc

存在问题:一开始就发生了 3 次 full gc , 很明显不太正常;

4) GC 统计

GC Statistics:GC 统计

由上图可以得到,发生 gc 的总次数,young gc,full gc 的统计,gc 暂停时间统计。

5) GC 原因:

原因次数平均时间最大时间总耗时
Metadata GC Threshold643.3 ms190 ms260 ms
Allocation Failure533.77 ms10.0 ms200 ms

这里对这些原因解析一下:

  1. Metadata GC Threshold:元空间超阈值

  2. Allocation Failure :年轻代空间不足

这里补充一个原因,本案例还没出现的:

  • Ergonomics:译文是“人体工程学”,GC 中的 Ergonomics 含义是负责自动调解 gc 暂停时间和吞吐量之间平衡从而产生的 GC。关注公众号:码猿技术专栏,回复关键词 1111 获取阿里内部 java 性能调优手册;目的是使得虚拟机性能更好的一种做法。

由此可见,通过可视化的工具,可以快速的帮我们分析 GC 的日志。我们得善于利用工具。

因为 gc 的日志文件,内容太多,都是密密麻麻的数字,文本。看得实在是头疼。

有了gc easy可视化工具,而且还是在线的,十分的方便。GC 日志分析是免费的


                

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

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

相关文章

【python数据分析】对淘商品类母婴购物数据进行分析(含完整源码)

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 一、数据集 ​ 今天我们来看一个来着阿里云天池的数据集:淘母婴购物数据,有两个csv文件: 1、mum_baby.csv 它包含了953个孩子的生日和性别信息,这些信息是由淘或tian猫的消费者提供的…

足球视频AI(四)——队伍与裁判人员分类

一、基础概念 足球比赛中人员为:A队11人、B队11人、裁判,其中我们暂时不研究守门员。 需要将球场中的人员分类,并呈现在2D看板中。 1.1识别目标: 1)球场中的白队 2)球场中的蓝队 3)球场中的…

剑指offer----C语言版----第九天

目录 1. 剪绳子 1.1 题目描述 1.2 基础知识 1.2.1 动态规划 1.2.2 贪婪算法 1.3 思路一:动态规划 1.4 思路二:贪婪算法 1.5 思路一的优化 1. 剪绳子 原题链接:剑指 Offer 14- I. 剪绳子 - 力扣(LeetCode)http…

无约束优化:Hessian-Free Optimization 拟牛顿类算法(BFGS,L-BFGS)

文章目录无约束优化:Hessian-Free Optimization 拟牛顿类算法(BFGS,L-BFGS)为什么要用拟牛顿算法割线方程严格凸且光滑函数的BFGS算法非凸但光滑函数的BFGS算法L-BFGS算法非凸非光滑函数的BFGS算法参考文献无约束优化:…

LInux僵尸进程的解决方法

文章目录僵尸进程是如何出现的?如何防止僵尸进程产生?使用wait函数使用waitpid函数阻塞等待非阻塞等待——轮询僵尸进程出现后如何解决?僵尸进程是如何出现的? 一个进程在退出后,操作系统会释放该进程对应的资源&…

网络舆情监测管理制度及处置机制,网络舆情监测服务项目实时方案?

舆情监测通常包括搜集、分析和报告舆论信息的过程。搜集信息的途径包括网络新闻、社交媒体、博客、论坛等,分析信息的方法包括自然语言处理、数据挖掘、模糊属性决策分析等。接下来TOOM舆情监测小编带您简单了解网络舆情监测管理制度及处置机制,网络舆情…

奈奎斯特采样定理(Nyquist)

采样定理在1928年由美国电信工程师H.奈奎斯特首先提出来的,因此称为奈奎斯特采样定理。1933年由苏联工程师科捷利尼科夫首次用公式严格地表述这一定理,因此在苏联文献中称为科捷利尼科夫采样定理。1948年信息论的创始人C.E.香农对这一定理加以明确地说明…

VirtualBox+Vagrant快速搭建linux虚拟环境

VirtualBoxVagrant快速搭建linux虚拟环境 1.下载安装VirtualBox 下载 Virtual Box 官网: https://www.virtualbox.org/ 2.BIOS 里修改设置开启虚拟化设备支持(f2, f10) 参考: https://jingyan.baidu.com/article/ab0b56305f2882c15afa7dda.html 3.安装 Virtual Box&#xff…

【自学Python】Windows Python交互式运行

Windows Python交互式运行 Windows Python交互式运行教程 安装好 Python 之后,Python 都会提供一个 Python 命令行工具,就叫 python。 python 命令行工具不仅能用于运行 Python 程序,也可作为一个交互式解释器,即开发者可以在该…

9种 分布式ID生成方式

一、为什么要用分布式ID? 在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征? 1、什么是分布式ID? 拿MySQL数据库举个栗子: 在我们业务数据量不大的时候&#…

AcWing算法提高课:区间DP

两种实现方式 循环式 一般对于一维的DP问题可以应用。 for(len 1; len < n; len)for(l 1; l len-1 < n; l)r l len - 1;//枚举方案数记忆化搜索式 一般在二维DP中使用 循环也倒是可以&#xff0c;但是层数太多&#xff0c;所以使用记忆化进行实现。 常见策略 …

深入解读Netty 底层核心源码,全面分析Netty特新

前言 Netty 是一款基于 NIO&#xff08;非阻塞 I/O&#xff09;开发的网络框架&#xff0c;与传统 BIO 相比&#xff0c;它的并发性能得到了很大的提高&#xff0c;而且更加节省资源。Netty 不仅封装了 NIO 操作的很多细节&#xff1b;在设计上还基于灵活、可扩展的事件驱动模…

java学习day68(乐友商城)RabbitMQ及数据同步

今日目标&#xff1a; 了解常见的MQ产品 了解RabbitMQ的5种消息模型 会使用Spring AMQP 利用MQ实现搜索和静态页的数据同步 1.RabbitMQ 1.1.搜索与商品服务的问题 目前我们已经完成了商品详情和搜索系统的开发。我们思考一下&#xff0c;是否存在问题&#xff1f; 商品的…

Qt样式(qss)的几套配色方案

背景&#xff1a;之前写过有关qss的博客&#xff0c;记录了如何使用qt手册&#xff0c;以及在项目中如何使用qss的体验。经过实践&#xff0c;我归纳了自己需要的qss使用方法&#xff0c;使之尽量高效&#xff0c;容易维护。Qt样式&#xff08;qss&#xff09;手册小结&#xf…

工业数字孪生技术在钢铁企业中的应用展示

目前随着网络技术的发展&#xff0c;数字孪生技术已逐步应用于智慧工厂、智慧城市等领域。钢铁生产作为典型的工业流程制造场景&#xff0c;具备工艺复杂、物料交叉、生产节奏紧凑等特点。借助数字孪生技术仿真、虚实融合等能力&#xff0c;对钢铁生产过程的各个环节进行指导与…

SpringBoot+VUE前后端分离项目学习笔记 - 【14 SpringBoot和Vue实现用户登录】

前端代码 Login.vue 注意&#xff1a;el-form必须写 :model 否则无法使用表单校验功能 <el-form-item> 不能少 <template><div class"wrapper"><div style"margin: 200px auto; background-color: #fff; width: 350px; height: 300px; pa…

魔兽世界私服架设 服务器架设简易教程

今天早晨明杰终于把魔兽世界的私服搭建成功可以运行了。挺happy。记录一下搭建的全过程&#xff1a;1.先下载私服服务器端&#xff1a;从mangoscn.com下载大芒果ftp://www.mangoscn.com/TCCN-3.2.2-Trinity5749.exe从这个地址下载不需要注册&#xff0c;如果从mangoscn.com的网…

Python+Yolov5反光衣黄色马甲特征识别监测快速锁定目标人物体

程序示例精选 PythonYolov5反光衣识别 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 Yolov5比较Yolov4,Yolov3等其他识别框架&#xff0c;速度快&#xff0c;代码结构简单&#xff0c;识别效率高&#xff0…

计算机网络进阶 ---- MGRE ---- NHRP ---- 详解

一、MGRE&#xff08;多点GRE&#xff09;&#xff1a; 属于 NBMA 网络类型&#xff1b;在所有要连通的网络之间仅需要构建一个MA网段即可&#xff1b;且仅可以存在一个 固定的 IP地址&#xff0c;看作中心站点&#xff1b;其他分支站点可以是动态的 IP地址&#xff0c;节省成…

从recat源码角度看setState流程

setState setState() 将对组件 state 的更改排入队列批量推迟更新&#xff0c;并通知 React 需要使用更新后的 state 重新渲染此组件及其子组件。其实setState实际上不是异步&#xff0c;只是代码执行顺序不同&#xff0c;有了异步的感觉。 使用方法 setState(stateChange | u…