【Java虚拟机】JVM日志分析和可视化工具实操

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【Java虚拟机】JVM日志分析和可视化工具实操

1.JVM垃圾GC日志参数配置实战

  • Java虚拟机中垃圾收集器在运行过程中输出的日志信息
  • 主要用于分析垃圾收集器的运行状态、优化垃圾收集器的工作效率以及定位垃圾收集相关的问题
  • GC日志会包含以下内容
  • 垃圾收集器的名称和版本信息。
  • 垃圾收集器的运行时间、开始时间和结束时间。
  • 垃圾收集器的运行模式、垃圾收集算法和垃圾收集器的参数设置。
  • 垃圾收集器的运行情况,包括垃圾收集的次数、垃圾收集的时间、垃圾回收的内存空间等
  • 常见参数
参数配置 说明
-XX:+PrintGC 简单GC日志,JDK8后过期,后续会被移除,新版采用 -Xlog:gc
-XX:+PrintGCDetails GC详细日志,JDK8后过期,后续会被移除,新版采用-Xlog:gc*
-Xloggc:gc.log 输出GC日志到文件 ,可以指定绝对的路径,JDK8后过期,后续会被移除
新版采用-Xlog:gc:file=<filepath>
-verbose:gc 标准的选项,输出GC日志
  • 测试代码
/**
 * 模拟OOM测试
 * @author lixiang
 * @date 2023/5/4 20:53
 */
public class JVMTest {
    public static void main(String[] args) throws InterruptedException {
        List<Object> objects = new ArrayList<>();
        while(true){
            objects.add(new Object());
        }
    }
}
  • 配置案例实战,JDK11版本,G1垃圾收集器
-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms524m -Xmx524m -XX:+PrintCommandLineFlags -Xlog:gc:gc.log

743fc20264ef4966a792c117a94809f3.jpg

acfa8856216543a49ad5ab4576eb840a.jpg

新版GC日志输出的组成部分

  • 时间戳:记录GC发生的时间戳,精确到毫秒
  • 日志级别:日志的级别,包括debug、trace、info、warning、error等
  • 日志标签:日志的标签,用于区分不同类型的日志
  • 日志内容:记录GC相关的信息,包括GC算法、GC的时间、GC前后的内存使用情况、回收的对象数量等。
  • 新版GC日志配置格式 -Xlog:[selectors]:[output]:[decorators][:output-options]
  • JVM 采用的是 =的形式来表示 selectors
  • 默认情况下 tag 为all,表示所有的 tag,level 为 INFO
  • selector 可以进行组合的,不同的 selector 之间用逗号分隔
  • 同时输出 gcgc+metaspace 这两类 tag 的日志 -Xlog:gc=debug,gc+metaspace:gc.log
-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms524m -Xmx524m -XX:+PrintCommandLineFlags  -Xlog:gc=debug,gc+metaspace:gc.log

image.jpeg

  • JVM 提供了通配符 * 来解决精确匹配的问题,比如想要所有 tag 为 gc 的debug级别日志 -Xlog:gc*=debug
-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms524m -Xmx524m -XX:+PrintCommandLineFlags  -Xlog:gc*=debug:gc.log
# gc*=debug:指定输出GC相关日志,级别为debug,*表示所有的GC标签都会输出日志。


image.jpeg

  • 日志文件解读
-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms524m -Xmx524m -XX:+PrintCommandLineFlags -Xlog:gc=info:gc.log

cf4e15df4c404390b5e8f23dc2008231.jpg

日志内容
[24.575s][info][gc] GC(0) Pause Young (Concurrent Start) (G1 Humongous Allocation) 240M->238M(528M) 5.888ms
字段拆解
  [24.575s]:GC发生的时间戳,表示程序运行的时间
  [info]:日志级别,表示这是一条信息级别的日志
  [gc]:日志标签,表示这是一条GC相关的日志
  GC(0):GC的编号,表示这是第一次GC
  Pause Young (Concurrent Start) (G1 Humongous Allocation):
    GC的类型,表示这是一次Young GC,同时也是一次 Humongous Allocation的GC,其中Concurrent Start表示并发启动的GC。
  240M->238M(528M):
    GC前后堆内存的使用情况,其中240M表示GC前的已使用内存,238M表示GC后的已使用内存,528M表示堆内存的总大小
  5.888ms:GC的耗时,表示这次GC的执行时间
  这条GC日志记录了程序运行了24.575秒时发生的一次Young GC,回收了2M的内存空间,耗时5.888毫秒
————————————————————————————————————————————————————————
日志内容
[24.783s][info][gc] GC(3) Concurrent Cycle
[24.784s][info][gc] GC(3) Pause Remark 242M->242M(528M) 0.383ms
[24.784s][info][gc] GC(3) Pause Cleanup 242M->242M(528M) 0.066ms
[24.785s][info][gc] GC(3) Concurrent Cycle 2.374ms
字段拆解
  [24.783s][info][gc] GC(3) Concurrent Cycle:
  Mixed GC的相关信息,表示这是一次Mixed GC的开始。
  [24.784s][info][gc] GC(3) Pause Remark 242M->242M(528M) 0.383ms
  Mixed GC的相关信息,表示这是一次Remark阶段的GC,回收了0M的内存空间,耗时0.383毫秒。
  [24.784s][info][gc] GC(3) Pause Cleanup 242M->242M(528M) 0.066ms:
  Mixed GC的相关信息,表示这是一次Cleanup阶段的GC,回收了0M的内存空间,耗时0.066毫秒。
  [24.785s][info][gc] GC(3) Concurrent Cycle 2.374ms:
  Mixed GC的相关信息,表示这是一次Mixed GC的结束,耗时2.374毫秒。
  这段GC日志记录了程序运行了24.783秒一次Mixed GC,Mixed GC回收了0M的内存空间,耗时2.374毫秒

使用技巧

  • GC日志输出到文件中 -Xlog:gc=info:file=/path/app.log
  • 指定日志切割的大小和方式 -

Xlog:gc=info:file=/path/app.log:filesize=104857600,filecount=5

  • filesize=104857600:指定单个日志文件大小为100MB,超过这个大小会自动切换到新的日志文件。
  • filecount=5:指定日志文件数量不超过5个,超过这个数量会删除最早的日志文件。
  • 配置实操
-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms524m -Xmx524m -XX:+PrintCommandLineFlags -Xlog:gc*=info:file=portal_gc.log:utctime,level,tags:filecount=5,filesize=1M

image.jpeg

  • 详细解释字段
-XX:+UseG1GC:使用G1垃圾回收器
-XX:MaxGCPauseMillis=100:设置最大垃圾回收暂停时间为100毫秒
-Xms524m:设置JVM堆的初始大小为524MB
-Xmx524m:设置JVM堆的最大大小为524MB
-XX:+PrintCommandLineFlags:打印JVM启动参数
-Xlog:gc*=info:file=portal_gc.log:utctime,level,tags:filecount=5,filesize=1M:
  Xlog:指定日志输出方式为日志文件。
  gc*:指定日志输出类型为GC相关的日志。
  info:指定输出日志的级别为info级别。
  file=portal_gc.log:指定日志输出的文件名为portal_gc.log。
  utctime:指定日志输出的时间戳使用UTC时间。
  level,tags:指定日志输出的格式包含级别和标签信息。
  filecount=5:指定最多保存5个日志文件。
  filesize=1M:指定每个日志文件的大小为1MB。
  • 该配置使用G1垃圾回收器,设置最大垃圾回收器暂停时间为100毫秒,JVM堆的初始堆大小和最大堆大小均为524MB,并打印JVM启动参数和输出GC日志到文件portal_gc.log中,文件数量为5个,每个文件大小为1MB,日志格式为info级别,包含时间戳、级别和标签。

2.JVM内存OOM堆栈快照配置实战

  • 配置OOM时的堆栈快照信息
  • -XX:+HeapDumpOnOutOfMemoryError:当发生OOM时,自动生成堆栈快照文件。
  • -XX:HeapDumpPath= :指定堆栈快照文件的输出路径。

-XX:OnOutOfMemoryError=“;”:当发生OOM时,执行指定的命令

案例-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof

-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms524m -Xmx524m -XX:+PrintCommandLineFlags -Xlog:gc*=info:file=portal_gc.log:utctime,level,tags:filecount=5,filesize=1M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof
  • 将在发生OOM时生成一个名为heapdump.hprof的堆栈快照文件,并将其保存到当前项目的目录下
  • heapdump.hprof 文件可以使用多种工具进行分析


43fea4dacf234a02bf6933f5ae245cb9.jpg


d7587ef638c2425b9dd4bd50f6d6cdc3.jpg

60f832ed9de64e2fa59d16607423b627.jpg

08e3d4c5183b4fcaa5d206528ec2432a.jpg

堆分析工具可能需要大量的内存和计算资源来加载和分析heapdump.hprof文件

建议在高配置的机器上运行堆分析工具,并为其分配足够的内存和计算资源

生产环境配置案例

服务器配置是8核16g内存,需要部署一个springboot写的电商项目,日访问量100万左右的UV

给一份生产环境配置的jvm参数的值,要求基于jdk11+配置oom时的堆栈快照信息

-server
-Xms8g
-Xmx8g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=32M
-XX:ActiveProcessorCount=8
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=heapdump.hprof
-XX:+PrintCommandLineFlags 
-Xlog:gc*=info:file=portal_gc.log:utctime,level,tags:filecount=50,filesize=100M
参数说明
  -Xms8g:指定JVM堆内存最小值为8G。
  -Xmx8g:指定JVM堆内存最大值为8G。
  -XX:+UseG1GC:指定使用G1垃圾收集器。
  -XX:MaxGCPauseMillis=200:指定最大垃圾回收暂停时间为200毫秒。
  -XX:G1HeapRegionSize=32M:指定G1垃圾收集器的堆区域大小为32MB。
  -XX:ActiveProcessorCount=8:指定并行垃圾回收器的线程数为8,在JDK 9及之后的版本中,ParallelGCThreads参数已被替代为-XX:ActiveProcessorCount参数,用于自动计算并行垃圾回收线程数
  -server:指定JVM使用服务器模式运行,优化性能。
  -XX:+HeapDumpOnOutOfMemoryError:指定在发生内存溢出时生成堆转储文件。
  -XX:HeapDumpPath=/var/log/heapdump.hprof:指定堆转储文件的路径。
  -Xlog:gc*=info:file=portal_gc.log:utctime,level,tags:filecount=50,filesize=100M:指定GC日志的输出格式和位置,记录GC相关信息。
  -XX:+PrintCommandLineFlags:打印JVM启动时的命令行参数,可以去除
方便测试OOM,可以调整 -Xms524m -Xmx524m

注意:使用G1收集器的时候,不用指定-Xmn

在G1中,堆内存被划分为多个区域,每个区域都可以作为年轻代或老年代的一部分

G1的年轻代采用了不同于传统的基于分代的HotSpot垃圾收集器的方式,因此不需要指定-Xmn参数来设置年轻代的大小

G1利用自适应的内存分配策略来动态地调整年轻代的大小

根据堆的使用情况来确定哪些区域应该作为年轻代,以及年轻代的大小

G1垃圾收集器不需要显式地指定-Xmn参数,通过自适应的方式来优化内存的使用和垃圾收集的效率

3.可视化GC日志分析工具GCEasy实战

GC Easy一个在线GC日志分析工具,可以帮助用户快速分析Java应用程序的GC日志,诊断内存泄漏和性能问题


支持多种GC日志格式,包括HotSpot、JRockit、IBM、Azul等。


自动分析GC日志,并生成易于阅读和理解的报告,包括GC统计信息、GC时长、GC频率、堆内存使用情况、内存泄漏等。


提供多种分析工具和图表,例如内存使用情况图、GC时长图、GC频率图、内存泄漏图等。


提供建议和最佳实践,帮助用户优化Java应用程序的性能和内存使用。


使用GCEasy的步骤


收集Java应用程序的GC日志。


将GC日志文件上传到GCEasy网站。


点击“开始分析”按钮,等待分析结果。


查看分析结果和建议,根据需要进行优化。


地址:https://gceasy.io/

142e17bf3210495090709737fe4ec555.jpg

aaf2eddc85784e74a5f732fb00c30c71.jpg

b7a03affa6894d71987c23898febefe7.jpg

6c4908de1b724fafb987d57a39657925.jpg


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
4月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
185 0
|
5月前
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
584 4
|
1月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
163 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
2月前
|
运维 安全 数据可视化
日志审查安排工具实战攻略:中小团队如何通过日志审查安排工具建立可控、安全的审查机制?
在审计敏感时代,日志审查安排工具成为安全运维与合规管理的关键利器。它实现审查任务的流程化、周期化与可视化,支持多系统协作、责任到人,确保“可控、可查、可追”的日志治理。工具如板栗看板、Asana、Monday 等提供任务调度、问题闭环与合规对接能力,助力企业构建高效、透明的日志审查体系,提升安全与合规水平。
|
3月前
|
Java 数据安全/隐私保护 计算机视觉
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本内容提供Java生成自定义图片的示例代码,涵盖基础图像创建、文本添加及保存功能,适合学习2D图形编程。包括教学示例图片生成、文本图层处理和数字水印技术实现方案。
|
2月前
|
存储 运维 Kubernetes
Java启动参数JVM_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError"
本文介绍了Java虚拟机(JVM)常用启动参数配置,包括设置初始堆内存(-Xms512m)、最大堆内存(-Xmx1024m)及内存溢出时生成堆转储文件(-XX:+HeapDumpOnOutOfMemoryError),用于性能调优与故障排查。
289 0
|
3月前
|
安全 Java 编译器
JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
1667 1
|
4月前
|
存储 监控 算法
Java程序员必学:JVM架构完全解读
Java 虚拟机(JVM)是 Java 编程的核心,深入理解其架构对开发者意义重大。本文详细解读 JVM 架构,涵盖类加载器子系统、运行时数据区等核心组件,剖析类加载机制,包括加载阶段、双亲委派模型等内容。阐述内存管理原理,介绍垃圾回收算法与常见回收器,并结合案例讲解调优策略。还分享 JVM 性能瓶颈识别与调优方法,分析 Java 语言特性对性能的影响,给出数据结构选择、I/O 操作及并发同步处理的优化技巧,同时探讨 JVM 安全模型与错误处理机制,助力开发者提升编程能力与程序性能。
Java程序员必学:JVM架构完全解读
|
3月前
|
JavaScript API 开发工具
HarmonyOS NEXT实战:日志工具
本文介绍了在HarmonyOS Next应用开发中,如何封装一个简单易用的日志工具LoggerKit。通过使用系统提供的HiLog API,开发者可以灵活输出不同级别的日志信息(DEBUG、INFO、WARN、ERROR、FATAL),用于分析应用运行状态和调试逻辑问题。文章详细说明了日志级别、参数配置及使用注意事项,并提供了完整的TypeScript封装示例代码,便于实际项目集成与应用调试。
98 0
|
3月前
|
Java 数据安全/隐私保护
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本项目提供了一套基于Java的图片处理教学方案,包含自定义图片生成、图像水印添加及合法电子凭证生成技术示例。