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

news2025/1/16 18:05:01

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

  • Java虚拟机中垃圾收集器在运行过程中输出的日志信息
  • 主要用于分析垃圾收集器的运行状态、优化垃圾收集器的工作效率以及定位垃圾收集相关的问题
  • GC日志会包含以下内容
    • 垃圾收集器的名称和版本信息。
    • 垃圾收集器的运行时间、开始时间和结束时间。
    • 垃圾收集器的运行模式、垃圾收集算法和垃圾收集器的参数设置。
    • 垃圾收集器的运行情况,包括垃圾收集的次数、垃圾收集的时间、垃圾回收的内存空间等
  • 常见参数
参数配置说明
-XX:+PrintGC简单GC日志,JDK8后过期,后续会被移除,新版采用 -Xlog:gc
-XX:+PrintGCDetailsGC详细日志,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

在这里插入图片描述在这里插入图片描述

  • 新版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
    

    在这里插入图片描述

    • 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标签都会输出日志。
    

    在这里插入图片描述

  • 日志文件解读

-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms524m -Xmx524m -XX:+PrintCommandLineFlags -Xlog:gc=info:gc.log

在这里插入图片描述

日志内容
[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

在这里插入图片描述

  • 详细解释字段
-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 文件可以使用多种工具进行分析

在这里插入图片描述

  • 在线分析工具:https://heaphero.io

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  • 堆分析工具可能需要大量的内存和计算资源来加载和分析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/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Fluent】利用TUI命令在保存或导出文件时,给文件名加上时间步长、流动时间、迭代步数等求解过程变量的自动编码

一、问题背景 在CSDN的一篇博客&#xff08;从Fluent导出数据到txt文档&#xff09;中&#xff0c;一位博主分享了一串导出求解数据的TUI命令。 file/export/ascii data%t.txt () yes h2s y-velocity x-velocity q no 当时我不知道里面的%t是啥意思&#xff0c;估计是跟时间…

JMeter介绍与安装教程

简介 JMeter是一款开源的负载测试工具&#xff0c;它可以用于测试Web应用程序、API、数据库、负载均衡器等。JMeter 是由 Apache 软件基金会开发的&#xff0c;其目标是提供一个高性能、易于使用的负载测试工具。 JMeter 具有以下特点&#xff1a; 可扩展性&#xff1a;JMet…

又开发好一个系统,详细记录软著申请过程

经过几个通宵达旦的撸代码之后&#xff0c;又开发好了一个系统&#xff0c;和以往一样&#xff0c;系统开发好了少不了申请软件著作权证书&#xff0c;兄弟们&#xff0c;软著申请搞起来啊。 在版权保护中心后台提交资料&#xff0c;没有账号的需要先注册一个账号。很重要的一步…

停车场收费系统

1.系统的开发工具 1.1 AppServe集成应用 Mysql&#xff1a;MySQL 是一款安全、跨平台、高效的&#xff0c;并与 PHP、Java 等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的 MySQL AB 公司开发、发布并支持&#xff0c;由 MySQL 的初始开发人员 David Axmark 和 Mi…

【网络技术】什么是CIDR

序言 世界上最幸福的事之一&#xff0c;莫过于经过一番努力后&#xff0c;所有东西正慢慢变成你想要的样子。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 1 基础介…

【设计模式】单例模式(懒汉和饿汉模式详解)

目录 1.设计模式是什么&#xff1f; 2.单例模式 1.概念&#xff1a; 2.如何设计一个单例 1.口头约定&#xff08;不靠谱&#xff09; 2.使用编程语言的特性来处理 3.使用"饿汉模式"设计单例 1.详细步骤 2.完整代码 4.使用"饿汉模式"设计单例 1.详…

php+vue在线课程教育学习考试系统864t7

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin功能要求&#xff1a;可以实现首页、个人中心、学生管理、名…

嵌入式软考备考_7 系统开发过程和项目管理

系统开发过程和项目管理 开发模型 把开发过程分成一些阶段。 瀑布模型&#xff1a;SDLC。缺陷在于最开始需求要明确&#xff0c;但是开发周期很难不变动。 因此改进&#xff1a; 原型&#xff1a;一个demo。 快速原型模型&#xff1a;抛弃模型&#xff0c;一旦获取到了用户需…

unity 基本寻径

一、实现效果&#xff1a;敌人追逐玩家&#xff0c;自动躲避障碍物 二、游戏框架 Plane&#xff1a;平面&#xff0c;是玩家和敌人可以行走的区域 Player&#xff1a;玩家&#xff0c;可以在平面上移动&#xff0c;绕开障碍物 Enemy&#xff1a;敌人&#xff0c;可以追逐玩家…

红外遥控且自动避障的嵌入式智能小车系统

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 本次实验使用树莓派作为开发平台&#xff0c;AlphaBot 作为开发载体&#xff0c;Python 作为开发语言&#xff0c;开发一种基于红外线遥控控制的、可自动避障的嵌入式智能小车系统。 智能系统中的嵌入式应用 实验目的 嵌入式…

MySQL双写缓冲区(Doublewrite Buffer)

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 摘要为什么需要Doublewrite BufferDoublewrite Buffer原理Doublewrite Buffer相关参数总结 摘要 InnoDB是MySQL中一种常用的事务性存储引擎&#xff0c;它具有很多优秀的特性。其中&#xff0c;Dou…

pip的常用操作命令

1. 忽略已安装的库&#xff08;以llvmlite为例&#xff09; pip install xxx --ignore-installed llvmlite 2. 错误 - AttributeError: int object has no attribute endswith 解决方案&#xff1a; 常见原因因为使用的pip为pip2&#xff0c;可以使用 pip -V 查看pip版本&a…

springboot+vue校园博客系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园博客系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…

AD 域环镜 本地管理员密码解决方案(LAPS)部署

前言&#xff1a; 我们知道window10装好后&#xff0c;默认本地管理员账号Administrator是关闭的&#xff0c;通过组策略启用本地管理员账号没有问题&#xff0c;具体方法在下面&#xff0c;但是由于微软《MS14-025&#xff1a;组策略首选项中的漏洞可能允许特权提升&#xff…

06-引入SpringSecurity 尚筹网

SpringSecurity 框架用法简介 用户登录系统时我们协助 SpringSecurity 把用户对应的角色、权限组装好&#xff0c;同时把各个资源所要求的权限信息设定好&#xff0c;剩下的“登录验证”、“权限验证”等等工作都交给SpringSecurity。 权限管理过程中的相关概念 主体 英文单…

【源码解析】Spring Cloud Gateway使用RedisRateLimiter实现限流

实现方案 在gateway项目中引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency><dependency><groupId>org.springframework.boot</g…

3BHB003154R0101确定每个控制器将如何知道设备地址、识别发给它的消息

3BHB003154R0101确定每个控制器将如何知道设备地址、识别发给它的消息 DNP3 协议用于各种 SCADA 系统组件之间的通信。这些系统组件包括 SCADA 主站或HMI、远程终端单元和智能电子设备。SCADA 系统的操作员可以在其操作中监控 DNP3 协议&#xff0c;以提高系统可靠性。这将通过…

java版深圳 工程管理系统软件 自主研发,工程行业适用 软件源码

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

Redis 常见缓存问题与解决方案

文章目录 1. 缓存穿透解决方法 2. 缓存击穿解决方法 3. 缓存雪崩解决方法 在 redis 的应用场景中&#xff0c;需要考虑缓存在某些场景下可能出现的问题&#xff1a; 缓存穿透 缓存击穿 缓存雪崩 以下缓存问题的讨论都是基于以下应用架构讨论的&#xff1a; 1. 缓存穿透 对应…

Python 中的字典顺序

文章目录 Python 中的字典顺序在 Python 中将数字列表按词典顺序排序 我们将介绍 Python 中的字典顺序。 我们还将通过示例讨论实现词典顺序的不同方法。 Python 中的字典顺序 在数学中&#xff0c;词典顺序或词典顺序是对按字母顺序排列的元素列表或元素数组进行排序的过程。…