Java GC日志分析 - GC暂停时间长

简介: 通过Java GC日志分析,帮助用户从CMS GC升级到G1 GC,帮助解决升级过程中的各种问题

用户诉求

某日接到业务同学的反馈如下:

  1. 业务运行过程中经常出现超长的暂停时间,导致健康检查失败,引发问题
  2. 应用本身是做离线数据处理,对时延要求不是很高,能保证大部分暂停在1200毫秒以下不要出现超长的暂停即可,更加看重应用的吞吐
  3. 应用当前使用的是CMS GC,用户希望顺应技术发展趋势,升级到G1 GC,并一并解决上述问题

GC日志分析

首先看一下原本使用CMS时问题有多严重,文件上传后先调整一下分析配置:

image.png

看问题诊断,发现有很多Full GC, Final Remark和Young GC的暂停时间都会超过1200ms。

image.png

再看一下暂停视图,发现有时超时非常多。

image.png

用户修改了JVM启动参数,从CMS GC升级到G1 GC,运行了一段时间后重新上传GC日志进行分析,看问题诊断,暂停信息和GC阶段三个部分:

image.png

image.png

image.png

发现升级到G1 GC后可以看到应用的暂停时间基本满足要求了,但是由于G1默认会试图把应用暂停尽量控制在200ms以下,而当前应用的暂停整体偏长,导致G1试图把年轻代压缩得特别小来控制暂停时间,导致GC变得较为频繁,引起应用整体的吞吐下降(应用吞吐主要看的是”GC暂停时间占比“指标,从2.38%升到了3.87%)。

image.png

image.png

于是为了降低Young GC的频率增大年轻代大小,应用按照建议增加了以下JVM参数进行调优:

-XX:MaxGCPauseMillis=400 -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=40

运行一段时间后,发现虽然能解决GC频繁的问题,但是由于年轻代大小的最小值被设的太高,影响了G1 GC自动调节能力,导致了新的Full GC和To-space Exhausted,引起超长暂停。

image.png

image.png

于是再次进行JVM参数调优:

-XX:G1NewSizePercent=20 -XX:-XX:InitiatingHeapOccupancyPercent=40

新的参数运行一段时间后没有再发现新的问题,至此用户G1 GC升级完成。用户在Java GC日志分析工具的辅助下,通过JVM参数调优,在保持应用吞吐影响不大的情况下解决了时延问题,整体效果满意。


欢迎投稿「应用诊断分析平台ATP」问题诊断分析的案例

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
10月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
2850 8
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
10月前
|
存储 监控 Java
G1原理—7.G1的GC日志分析解读
本文进行了TLAB的GC日志解读、YGC的GC日志解读、模拟YGC(单次GC及多次GC的不同场景)、打开实验选项查看YGC的详情日志信息、Mixed GC日志信息之初始标记过程、Mixed GC日志信息之混合回收过程。
|
11月前
|
XML JSON Java
Java中Log级别和解析
日志级别定义了日志信息的重要程度,从低到高依次为:TRACE(详细调试)、DEBUG(开发调试)、INFO(一般信息)、WARN(潜在问题)、ERROR(错误信息)和FATAL(严重错误)。开发人员可根据需要设置不同的日志级别,以控制日志输出量,避免影响性能或干扰问题排查。日志框架如Log4j 2由Logger、Appender和Layout组成,通过配置文件指定日志级别、输出目标和格式。
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
322 2
|
监控 Java Linux
Java 性能调优:调整 GC 线程以获得最佳结果
Java 性能调优:调整 GC 线程以获得最佳结果
365 11
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
1485 3
|
存储 数据可视化 安全
一个简单案例,带你看懂GC日志!
一个简单案例,带你看懂GC日志!
121 0
一个简单案例,带你看懂GC日志!