Java GC Log 分析工具

简介: 了解 GC Log (垃圾收集日志)并不是一件容易的事情,至少对于大多数技术人员而已。毕竟,对于这玩意,需要我们能够深入地了解 Java 虚拟机的工作原理以及对应用程序的内存使用情况的理解。在此篇文章中,我们将跳过应用程序的分析,因为它与应用程序的应用程序不同,并且需要对代码的知识。我们将讨论的是可以借助哪些工具使得我们能够读取和分析从 JVM 中获取的垃圾收集日志,以便正确定位问题。

    了解 GC Log (垃圾收集日志)并不是一件容易的事情,至少对于大多数技术人员而已。毕竟,对于这玩意,需要我们能够深入地了解 Java 虚拟机的工作原理以及对应用程序的内存使用情况的理解。在此篇文章中,我们将跳过应用程序的分析,因为它与应用程序的应用程序不同,并且需要对代码的知识。我们将讨论的是可以借助哪些工具使得我们能够读取和分析从 JVM 中获取的垃圾收集日志,以便正确定位问题。

    在实际的业务场景中,基于不同的特性存在各种不同的 JVM 厂商及版本和多个垃圾收集器实现。可能,在绝大多数环境中可以遇到 Java 7、8、11甚者15等。当然,由于各种历史原因,一些传统企业或许仍然使用 Java 6。每个版本可能都可以运行不同的垃圾收集器 - 串行,并行,并发标记扫描,G1 甚至是即将流行的 ZGC 等。

    那么,既然 GC Log 如此重要,它能够给我们回答哪些“硬核”的问题呢?基于通用型角度而言,主要涉及以下:

    1、什么时候使用年轻代垃圾收集器?

    2、什么时候使用老年代垃圾收集器

    3、回收了多少垃圾?

    4、垃圾收集器运行多久了?

    5、垃圾收集之前和之后的内存利用率是多少?

   现在让我们看看一个 JVM 垃圾收集器日志中取出的示例,并分析每个片段,突出显示它的关键部分。下面我们将展示一个标准的基于 G1 垃圾收集日志示例,具体如下所示:


[2021-04-26T14:19:14.307+0000][info][gc,heap] Heap region size: 1M
[2021-04-26T14:19:14.317+0000][info][gc     ] Using G1
[2021-04-26T14:19:14.318+0000][info][gc,heap,coops] Heap address: 0x00000007e0000000, size: 512 MB, Compressed Oops mode: Zero based, Oop shift amou
nt: 3
[2021-04-26T14:19:15.011+0000][info][gc,start     ] GC(0) Pause Young (Normal) (G1 Evacuation Pause)
[2021-04-26T14:19:15.011+0000][info][gc,task      ] GC(0) Using 4 workers of 4 for evacuation
[2021-04-26T14:19:15.014+0000][info][gc,phases    ] GC(0)   Pre Evacuate Collection Set: 0.1ms
[2021-04-26T14:19:15.014+0000][info][gc,phases    ] GC(0)   Evacuate Collection Set: 2.3ms
[2021-04-26T14:19:15.014+0000][info][gc,phases    ] GC(0)   Post Evacuate Collection Set: 0.4ms
[2021-04-26T14:19:15.015+0000][info][gc,phases    ] GC(0)   Other: 0.9ms
[2021-04-26T14:19:15.015+0000][info][gc,heap      ] GC(0) Eden regions: 25->0(306)
[2021-04-26T14:19:15.015+0000][info][gc,heap      ] GC(0) Survivor regions: 0->1(4)
[2021-04-26T14:19:15.015+0000][info][gc,heap      ] GC(0) Old regions: 0->0
[2021-04-26T14:19:15.015+0000][info][gc,heap      ] GC(0) Humongous regions: 0->0
[2021-04-26T14:19:15.015+0000][info][gc,metaspace ] GC(0) Metaspace: 5775K->5775K(1056768K)
[2021-04-26T14:19:15.015+0000][info][gc           ] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 25M->0M(512M) 3.965ms
[2021-04-26T14:19:15.015+0000][info][gc,cpu       ] GC(0) User=0.01s Sys=0.00s Real=0.00s
[2021-04-26T14:19:17.216+0000][info][gc,start     ] GC(1) Pause Young (Normal) (G1 Evacuation Pause)
[2021-04-26T14:19:17.216+0000][info][gc,task      ] GC(1) Using 4 workers of 4 for evacuation
[2021-04-26T14:19:17.232+0000][info][gc,phases    ] GC(1)   Pre Evacuate Collection Set: 0.0ms
[2021-04-26T14:19:17.233+0000][info][gc,phases    ] GC(1)   Evacuate Collection Set: 12.7ms
[2021-04-26T14:19:17.233+0000][info][gc,phases    ] GC(1)   Post Evacuate Collection Set: 3.0ms
[2021-04-26T14:19:17.233+0000][info][gc,phases    ] GC(1)   Other: 0.7ms
[2021-04-26T14:19:17.233+0000][info][gc,heap      ] GC(1) Eden regions: 306->0(306)
[2021-04-26T14:19:17.233+0000][info][gc,heap      ] GC(1) Survivor regions: 1->1(39)
[2021-04-26T14:19:17.233+0000][info][gc,heap      ] GC(1) Old regions: 0->0
[2021-04-26T14:19:17.233+0000][info][gc,heap      ] GC(1) Humongous regions: 0->0
[2021-04-26T14:19:17.233+0000][info][gc,metaspace ] GC(1) Metaspace: 5863K->5863K(1056768K)
[2021-04-26T14:19:17.233+0000][info][gc           ] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 306M->0M(512M) 16.875ms
[2021-04-26T14:19:17.233+0000][info][gc,cpu       ] GC(1) User=0.01s Sys=0.00s Real=0.02s
[2021-04-26T14:19:19.855+0000][info][gc,start     ] GC(2) Pause Young (Normal) (G1 Evacuation Pause)
[2021-04-26T14:19:19.859+0000][info][gc,task      ] GC(2) Using 4 workers of 4 for evacuation
[2021-04-26T14:19:19.889+0000][info][gc,phases    ] GC(2)   Pre Evacuate Collection Set: 0.0ms
[2021-04-26T14:19:19.889+0000][info][gc,phases    ] GC(2)   Evacuate Collection Set: 28.1ms
[2021-04-26T14:19:19.889+0000][info][gc,phases    ] GC(2)   Post Evacuate Collection Set: 0.5ms

    众所周知,Java 垃圾收集器(GC)日志用于内存管理和对象分配和回收。GC Log 包括众多关键信息,例如 GC 进程的持续时间,升级的对象数等等,除此,整个 GC 进程的详细信息以及它使用的资源信息等一一展示。基于这些日志的以便能够有效检测问题并提高 JVM 应用程序的整体性能。    

那么它是如何工作的?

   与开发人员需要标记和删除对象的手动进程不同,Java 垃圾收集器会自动识别并清除 Java 程序不再使用的对象或组件。整个释放空间的过程中,帮助开发人员节省时间并更高效。

    基于应用程序性能调整复杂、繁琐的特性,在其初衷的设计理念中,Java GC 日志为我们提供了一种独特的方法,可以获得基于 Java 的应用程序的深入进行了解。GC 日志显示对象分配模式、诊断磁盘、CPU和内存相关问题等问题,并增强基于 Java 的应用程序性能。

为什么使用 Java GC 日志分析工具?

    GC 日志的可视化有限会导致耗时的搜索和未识别的过时对象。它还可以导致内存泄漏,长 GC 暂停,慢慢分析和监控。它还可以增加分辨率的平均时间,并影响基于 Java  的应用程序的性能。此外,在使用多个框架,服务器和应用程序的分布式环境中,手动分析大规模卷的 Java GC 日志将变得挑战。

    因此,集中式日志管理工具或平台的产生,使得其能够自动执行 Java GC 日志分析。这些工具帮助 IT团队关联不同的基础架构和应用程序日志,提供完美的日志记录体验。

    下面笔者以自身的经验将简要概述一些常用的 GC Log 分析工具,基于不同的业务环境以用于进行分析、监视和管理 Java GC 日志。

GC PLOT

    GCplot 是一个开源日志分析,旨在即时收集 Java GC 日志。它使日志分析随着根本原因分析,易于理解的图形和统计数据而努力。该工具采用高端技术,如端到端 SSL加密和强大的可视化功能,以确保安全流量。我们可以使用该工具的数据库备份,健康检查和聚类功能保护业务关键信息,可以在详细报告和图表中可视化 Java GC 日志和关键信息。 GCplot 可以在 Docker 容器上运行,而无需外部配置。


[administrator@JavaLangOutOfMemory MyDemo] % docker ps
CONTAINER ID   IMAGE           COMMAND       CREATED       STATUS       PORTS                                              NAMES
b13d6ff910fd   gcplot/gcplot   "/start.sh"   4 hours ago   Up 4 hours   2424/tcp, 2480/tcp, 0.0.0.0:80->80/tcp, 9042/tcp   gcplot_lee


GC Easy

   Gc Easy 是用于分析 Java GC 日志的记录工具。它使用机器学习和自动检测功能来跟踪 Java虚拟机上的问题。利用其机器学习算法,IT 团队可以轻松检测异组织,解决内存泄漏问题,GC 日志问题,并保存开发人员的时间。

    基于此工具,还可以生成详细的报告,具有指标,例如关键性能指示符和 GC 统计信息,以帮助团队解决 GC 日志问题。此外,Gc Easy 使用 REST API 快速监视和分析简单代码的所有日志。只需启用 GC 日志,上载所有 Java GC 日志,使用 REST API 立即监视大规模的日志,并可视化报告以识别改进区域。



SOLARWINDS Loggly

   SolarWinds®Loggly® 是一个强大的日志分析工具,具有独特的管理和监控 Java GC日志的方法。凭借其无代理架构,该工具会在不安装专有代理的情况下快速收集信息。通过 rsyslog 汇总,集中和导入日志。开发人员使用这些日志来关联数据并解决 GC 问题,例如内存泄漏和过早的对象分配。

   除此之外,此工具可以基于 Lucene 查询语法自动从分布式堆栈中检测 GC 日志。 凭借其增强的搜索和分析功能,该工具可以更快地检测和排除问题。 此外,我们可以在AWS S3 存储桶上使用 Loggly 存档旧的 GC 日志,以满足合规要求。 此外,基于其直观和可定制的仪表板能够反映包括图表,图形和旨在简化 GC 活动的跟踪的表,使得整个技术团队可以在其组织中共享仪表板。


GC Viewer

    GC Viewer 是一个免费的日志查看器和分析器,可帮助团队检测和可视化 Java 虚拟

机生成的 GC 日志。该工具在检测 Java 应用程序减速背后的原因方面发挥着重要作用。要使用该工具,开发人员需要汇总有用的 GC 日志文件并将其上传到 GCViewer 中。 该工具显示图表和图表,其中包含关于 GC 事件的信息、内存池大小、堆消耗、GC暂停、内存用法等的频率和持续时间。


    综上所述,GC 日志分析是为了识别问题,修复瓶颈和无缝运行基于 Java 的应用程序的最佳方法之一。在实际的业务场景中,基于上述所分享的工具使得我们能够对 GC 日志的分析有更全面、深入的了解,以便支撑我们在面对 Java 虚拟机问题时,能够游刃有余地去解决。

    以上为基于 Java GC Log 分析工具的相关分享,本文到此为止,大家有任何问题或建议,可以随时留言、沟通。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
15天前
|
监控 Java 开发者
Java一分钟之-Java性能分析与调优:JProfiler, VisualVM等工具
【5月更文挑战第21天】本文介绍了Java性能优化的两个利器——JProfiler和VisualVM。JProfiler通过CPU Profiler、内存分析器和线程视图帮助解决过度CPU使用、内存泄漏和线程阻塞问题;VisualVM则聚焦于GC行为调整和类加载优化,以减少内存压力和提高应用性能。使用这些工具进行定期性能检查,是提升Java应用效率的关键。
33 0
|
21天前
|
Java
探索Java世界的奇妙工具——运算符与表达式运算符
探索Java世界的奇妙工具——运算符与表达式运算符
12 0
|
21天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
45 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
6天前
|
监控 Java API
Java的日志框架
Java的日志框架
|
6天前
|
监控 Java 测试技术
性能工具之Java分析工具BTrace入门
【5月更文挑战第25天】性能工具之Java分析工具BTrace入门
16 2
|
8天前
|
存储 Java 数据库连接
从 0 实现一个文件搜索工具 (Java 项目)
从 0 实现一个文件搜索工具 (Java 项目)
51 17
|
13天前
|
Java Windows
用Java手搓一个转义工具
本文介绍了转义符的概念及其在编程中的作用,如`\n`、`\t`等,用于表示特殊字符。在Java中,通过`Scanner`接收用户输入,利用`escapeString`方法转义字符串中的特殊字符。示例代码展示了如何实现这一功能,读取用户输入,转义后打印结果。
27 2
|
20天前
|
Java
java使用AOP切面获取请求日志并记录
java使用AOP切面获取请求日志并记录
|
20天前
|
运维 监控 安全
Java一分钟之-Log4j与日志记录的重要性
【5月更文挑战第16天】Log4j是Java常用的日志框架,用于灵活地记录程序状态和调试问题。通过设置日志级别和过滤器,可避免日志输出混乱。为防止日志文件过大,可配置滚动策略。关注日志安全性,如Log4j 2.x的CVE-2021-44228漏洞,及时更新至安全版本。合理使用日志能提升故障排查和系统监控效率。
146 0
|
20天前
|
缓存 IDE Java
Java一分钟之-Gradle:构建自动化工具
【5月更文挑战第16天】本文介绍了Gradle,一个基于Groovy的灵活构建工具,强调其优于Maven的灵活性和性能。文中通过示例展示了基本的`build.gradle`文件结构,并讨论了常见问题:版本冲突、缓存问题和构建速度慢,提供了相应的解决策略。此外,还提醒开发者注意插件ID、语法错误和源代码目录等易错点。掌握这些知识能提升开发效率,使构建过程更顺畅。
41 2