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 分析工具的相关分享,本文到此为止,大家有任何问题或建议,可以随时留言、沟通。


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
5月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
1711 1
|
6月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
198 4
|
4月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
646 4
|
4月前
|
存储 Java Go
【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举
牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!
255 2
|
4月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
254 0
|
5月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
1796 8
|
5月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
5月前
|
监控 安全 搜索推荐
使用EventLog Analyzer进行日志取证分析
EventLog Analyzer助力企业通过集中采集、归档与分析系统日志及syslog,快速构建“数字犯罪现场”,精准追溯安全事件根源。其强大搜索功能可秒级定位入侵时间、人员与路径,生成合规与取证报表,确保日志安全防篡改,大幅提升调查效率,为执法提供有力证据支持。
203 0
|
6月前
|
机器学习/深度学习 安全 Java
Java 大视界 -- Java 大数据在智能金融反洗钱监测与交易异常分析中的应用(224)
本文探讨 Java 大数据在智能金融反洗钱监测与交易异常分析中的应用,介绍其在数据处理、机器学习建模、实战案例及安全隐私等方面的技术方案与挑战,展现 Java 在金融风控中的强大能力。