识别并解决Java垃圾回收问题
在 Java 开发中,开发人员是无需过度关注对象的回收与释放的,JVM 的垃圾回收机制可以减轻不少工作量。但完全交由 JVM 回收对象,也会增加回收性能的不确定性。在一些业务场景下,不合适的垃圾回收算法以及策略,都有可能导致系统性能下降甚至线上故障。
通过在线Demo)故障注入平台,注入例如
增加POD FullGC频率
故障来模拟真实环境中产生的垃圾回收问题。
本指南将展示如何使用Kindling-OriginX如何快速识别并解决Java中的垃圾回收造成的故障问题,并与目前处理垃圾回收问题的常用方法做一简单对比。
传统方式
由于垃圾回收引起的故障或性能问题的故障表征多样,可能表现为CPU飙高、内存OOM、请求响应超时、应用假死等等,传统方式中需要先能够确定出是垃圾回收导致的问题,再通过相关命令、分析GC日志、相关工具辅助等方法继续深入查找根因。
通过相关命令信息分析
线上故障一般主要是CPU、磁盘、内存以及网络问题,基本上出问题后就是df、free、top三连,之后再结合jstack、jmap深入分析,但操作步骤与命令繁多,极易出错,同时经常需要在各个环境和文件中来回切换,容易丢失上下文。这种方式适用多种场景,但对人员要求高且操作复杂。
分析GC日志
在需要测试和查找GC问题的环境中,可以通过配置GC日志相关的参数来输出GC相关的日志,用以分析GC相关的问题。但生产环境往往不会全部打开GC日志,同时分析GC日志是一项系统性的工作,这种方式通常适合用来辅助系统优化问题和对不紧急的问题进行排查。
借助性能诊断工具
业内已有不少性能诊断工具可以对垃圾回收问题进行比较全面的分析,例如JVisualVm、MAT、GCViewer、Arthas等。但一方面生产环境出现问题时,往往出于其安全性和隔离性等因素的考虑,无法方便的使用诊断工具,另一方面诊断工具有一定的学习使用成本,同时在排障时效性上也难以给出比较好的保障。
代码分析优化
通过找到具体的代码段分析造成垃圾回收的问题点,针对性地进行GC优化,以此来减少GC的频率和停顿时间。但这种方式需要开发者对于Java内存模型和常用性能调优点都足够熟悉,同时只适合在发布前及复盘阶段使用,当线上故障发生时几乎没法使用这种方式进行处置。
GC参数调优
为了使应用性能达到既定目标,通常需要调整垃圾回收器及其相关参数来进一步提高性能。但GC算法复杂,影响GC性能的参数众多,且参数调整又依赖于各自应用的特点,同时CMS、G1、ZGC又有不同的特性和参数,这些因素都导致了其优化难度大,甚至会适得其反。
使用Kindling-OriginX
Kindling-OriginX 能够快 速识别并定位因为Java垃圾回收导致的性能问题及各类故障,以自动化、零侵入、高效便捷、极低性能损耗方式提供高效易用的解决方案。
针对每一条 Tracing 自动化分析
- 分类统计当下故障服务情况,清晰直观发现问题点。
- 聚合单个服务故障报告,聚焦重点问题。
智能化生成可解释的故障根因报告
-
简明扼要给出可解释的根因报告,任何人都能据此高效定位问题原因。例如本例中给出根因是当前节点存在GC导致耗时增高。
-
报告包含 Trace 信息,描述、时间、耗时、TraceID等基本信息。
-
报告对节点链路调用情况及耗时数据进行详细对比分析。
-
提供节点详情、Trace 耗时情况对比及该时段对应日志。
-
提供各层级分段调用数据及单独的历史基线数据,使用户能够对代码执行的每一步都能了如指掌,通过耗时分析对问题方向提供明确指引。本例中futex耗时明显高于历史基线水平,其中Futex通常是一个线程在尝试获取一个Futex锁时因为锁已经被其他线程占用而进入等待状态的时间。
-
提供影响各条Trace数据的核心指标详情,帮助用户聚焦关键指标。报告中包含根因推导过程的详细数据及指标,既可还原推导过程又可帮助还原现场。本例中分析Futex耗时异常后,通过对数据的进一步分析,判定出是存在GC导致耗时异常导致,同时将YGC和FGC具体数据也进行展示,方便验证与还原问题现场。
Kindling-OriginX相较于传统工具和方法,能够快速分析并定位出Java应用中垃圾回收造成的问题,并智能化生成可解释的故障根因报告。
通过在线Demo)故障注入平台,注入例如 增加POD FullGC频率
故障来模拟真实环境中产生的垃圾回收问题。