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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 通过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」问题诊断分析的案例

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
14天前
|
监控 Java Linux
Java 性能调优:调整 GC 线程以获得最佳结果
Java 性能调优:调整 GC 线程以获得最佳结果
52 11
|
8天前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
25 3
|
11天前
|
存储 数据可视化 安全
一个简单案例,带你看懂GC日志!
一个简单案例,带你看懂GC日志!
一个简单案例,带你看懂GC日志!
|
1月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
2月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
2月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
2月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之AllLoggers接口获取异常日志的Logger实例的问题如何解决
Java应用结构规范问题之AllLoggers接口获取异常日志的Logger实例的问题如何解决
|
1月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制(GC)
本文将探讨Java的自动内存管理核心——垃圾回收机制。通过详细解析标记-清除算法、复制算法和标记-整理算法等常用垃圾回收算法,以及CMS、G1等常见垃圾回收器,帮助读者更好地理解Java应用的性能优化和内存管理。同时,探讨分代收集、分区收集等策略在实际项目中的应用。结语部分总结了垃圾回收机制在Java开发中的重要性,并展望了未来可能的发展。
41 0
|
2月前
|
存储 消息中间件 监控
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统ELK、日志收集分析
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统、日志收集分析。日志级别从小到大的关系(优先级从低到高): ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 低级别的会输出高级别的信息,高级别的不会输出低级别的信息
|
Java API Maven
一文搞懂Java日志级别,重复记录、丢日志问题(下)
一文搞懂Java日志级别,重复记录、丢日志问题
1205 0
一文搞懂Java日志级别,重复记录、丢日志问题(下)