jvm-47-jvm GC 日志获取方式+可视分析化工具 GcViewer

拓展阅读

JVM FULL GC 生产问题 I-多线程通用实现

JVM FULL GC 生产问题 II-如何定位内存泄露? 线程通用实现

JVM FULL GC 生产问题 III-多线程执行队列的封装实现,进一步抽象

jvm-44-jvm 内存性能分析工具 Eclipse Memory Analyzer Tool (MAT) / 内存分析器 (MAT)

jvm-45-jvm dump 文件内存介绍+获取方式+堆内存可视分析化工具

jvm-46-jvm Thread Dump 线程的堆栈跟踪信息+获取方式+可视分析化工具 FastThread

jvm-47-jvm GC 日志获取方式+可视分析化工具 GcViewer

jvisualvm java 性能分析工具

是什么?

Java 的垃圾回收(GC)日志提供了关于 JVM 垃圾回收过程的详细信息。

这些日志对于性能调优和分析垃圾回收行为至关重要。

通过 GC 日志,开发者可以了解堆内存的使用情况、垃圾回收的频率、每次 GC 的时间等信息,帮助排查内存泄漏、性能瓶颈等问题。

如何获得 GC 日志?

在 Java 8 之前,启用 GC 日志需要设置 -XX:+PrintGCDetails-XX:+PrintGCDateStamps 等 JVM 参数。

从 Java 9 开始,JVM 提供了统一的 GC 日志格式,可以通过 -Xlog:gc 启用日志记录。

Java 8 之前的方式:

bash 复制代码
-XX:+PrintGCDetails -XX:+PrintGCDateStamps

Java 9 及之后的方式:

bash 复制代码
-Xlog:gc*:file=gc.log

常见 GC 日志参数

  1. -XX:+PrintGCDetails

    打印详细的 GC 信息,包括每个垃圾回收周期的类型、堆的使用情况、GC 前后的堆状态等。

  2. -XX:+PrintGCDateStamps

    打印 GC 时间戳,帮助你确定垃圾回收的发生时间。

  3. -XX:+PrintGCTimeStamps

    记录垃圾回收的时间戳。

  4. -XX:+PrintHeapAtGC

    每次 GC 发生时,打印堆的详细信息(如堆内存大小、使用的内存等)。

  5. -XX:+PrintGCApplicationStoppedTime

    打印应用程序停顿的时间,尤其是在发生 Stop-the-World 的 GC 时,能够帮助定位性能瓶颈。

  6. -XX:+PrintTenuringDistribution

    打印年轻代到老年代的对象晋升分布,了解对象的生命周期和对象晋升的时机。

GC 日志的分析

GC 日志中的常见输出字段

GC 日志包含多个重要的字段,每个字段对应着不同的 GC 细节,以下是一些常见的字段及其含义:

  1. GC 事件类型

    常见的 GC 类型包括:

    • Minor GC:年轻代垃圾回收
    • Full GC:包括年轻代和老年代垃圾回收,通常需要进行 Stop-the-World 操作
    • Mixed GC:G1 垃圾回收器的一种类型,涉及年轻代和部分老年代回收
  2. 时间戳

    每次 GC 事件的时间。

  3. 堆的大小

    • Young Generation(年轻代)
    • Old Generation(老年代)
    • Permanent Generation(永久代,Java 8 之后被元空间(Metaspace)替代)
  4. GC 前后的堆内存状态

    GC 前后的堆使用情况:包括每个代(年轻代、老年代、元空间)的内存大小、已使用内存和最大内存。

  5. GC 停顿时间

    • Pause Time:GC 期间应用程序的停顿时间
    • Application Time:应用程序执行的时间,通常用于计算总的停顿时间与应用程序的执行时间比例。
  6. GC 执行时间

    每次 GC 的执行时间。例如:

    text 复制代码
    [GC (Allocation Failure)  [PSYoungGen: 2048K->512K(3072K)] 1024K->512K(4096K), 0.0012345 secs]

示例日志

假设在使用 G1 垃圾回收器时,GC 日志的输出可能如下所示:

text 复制代码
2024-11-28T08:00:00.001+0000: 0.001: [GC pause (young) (G1 Evacuation Pause) (mixed) 3124M->1024M(4096M), 0.0034567 secs]
2024-11-28T08:00:00.004+0000: 0.004: [GC pause (young) (G1 Evacuation Pause) (mixed) 2048M->1024M(4096M), 0.0023456 secs]

其中:

  • 2024-11-28T08:00:00.001+0000: 表示 GC 事件发生的时间。
  • 3124M->1024M(4096M): 表示 GC 之前年轻代占用的内存是 3124M,GC 后为 1024M,堆总内存是 4096M。
  • 0.0034567 secs: GC 执行的时间。

可视化工具

下面是对上述 GC 日志可视化分析工具的简明对比表格:

工具名称 支持的 GC 日志格式 特点 是否免费 使用方式
GCViewer Java 6 及以上 开源,支持多种 GC 日志格式,提供详细的 GC 图表分析 免费 下载并运行
Censum (JClarity) Java 8 及以上 商业工具,自动生成报告,深度分析 GC 停顿和内存使用情况 付费 上传日志文件
FastThread Java 8 及以上 在线工具,快速分析 GC 日志,自动生成报告和图表 免费 在线上传日志
GCEasy.io Java 8 及以上 在线工具,提供详细的 GC 分析报告,支持 G1、CMS 等 免费(有高级功能付费) 在线上传日志
VisualVM Java 6 及以上 官方工具,集成 GC 日志分析、内存分析、线程监控等 免费 下载并运行
XRebel GC Viewer Java 8 及以上 提供易于理解的图表和 GC 报告,支持停顿时间和内存使用分析 免费(有高级功能付费) 在线上传日志
JFR + JMC (Oracle) Java 8 及以上 官方工具,提供高效的性能分析,适用于生产环境 免费 JDK 内建,配置并运行

小结

希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。

我是老马,期待与你的下次相遇。

相关推荐
FG.2 分钟前
Day22
java·面试
菜鸟的迷茫4 分钟前
Redis 缓存雪崩、穿透、击穿面试题深度解析与 Spring Boot 实战代码示例
java
珹洺15 分钟前
C++算法竞赛篇:DevC++ 如何进行debug调试
java·c++·算法
SHUIPING_YANG22 分钟前
根据用户id自动切换表查询
java·服务器·数据库
爱吃烤鸡翅的酸菜鱼35 分钟前
IDEA高效开发:Database Navigator插件安装与核心使用指南
java·开发语言·数据库·编辑器·intellij-idea·database
惊涛骇浪、41 分钟前
SpringMVC + Tomcat10
java·tomcat·springmvc
墨染点香1 小时前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode
ldj20201 小时前
SpringBoot为什么使用new RuntimeException() 来获取调用栈?
java·spring boot·后端
超龄超能程序猿1 小时前
Spring 应用中 Swagger 2.0 迁移 OpenAPI 3.0 详解:配置、注解与实践
java·spring boot·后端·spring·spring cloud
风象南1 小时前
SpringBoot配置属性热更新的轻量级实现
java·spring boot·后端