JVM虚拟机(九)如何开启 GC 日志

目录

    • 一、引言
    • 二、开启 GC 日志
    • 三、解析 GC 日志
    • 四、优化建议

一、引言

在 Java 应用程序的运行过程中,垃圾收集(Garbage Collection,简称 GC)是一个非常重要的环节。GC 负责自动管理内存,回收不再使用的对象所占用的内存空间。为了了解 GC 的行为和性能,我们通常需要开启 JVM 的 GC 日志功能,收集并分析 GC 日志数据。


二、开启 GC 日志

Java 项目中,默认情况下 GC 日志功能是关闭的,有多种方法能够开启 GC 的日志功能,使用 -verbose:gc-XX:+PrintGC 都能创建基本的 GC日志(这两个日志表示实际上互为别名) ,但是使用 -XX:+PrintGCDetails 标志会创建更详细的 GC 日志。

先提供一个比较通用的开启日志方式供参考:

java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=14 -XX:GCLogFileSize=20M -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -Xloggc:springboot-demo-gc-%t".log" -jar springboot-demo.jar
  • -XX:+PrintGCDetails:打印更详细的 GC 日志信息,包括各个内存区域的使用情况、GC 的触发原因等。
  • -XX:+PrintGCTimeStamps:打印 GC 发生的时间戳。(以基准时间的形式)
  • -XX:+PrintGCDateStamps:打印 GC 发生的时间戳。(以标准时间的形式,如:2024-04-13T17:35:04.859+0800)
  • -XX:+UseGCLogFileRotation:启用 GC 日志文件的自动轮转功能,维持日志目录中的日志文件在一定的数目。
  • -XX:NumberOfGCLogFiles=14:GC 日志文件的滚动数量,使 GC 日志文件数量维持在 14 个,超出 14 个后,将日志覆盖写入到最早的日志文件中。
  • -XX:GCLogFileSize=20M:GC 日志文件的大小,超出大小后触发日志的轮转,将日志覆盖写入到最早的日志文件中。
  • -XX:+PrintHeapAtGC:在进行 GC 的前后打印出堆的信息。
  • -XX:+HeapDumpOnOutOfMemoryError:内存溢出的时候生成 dump 文件。
  • -XX:HeapDumpPath=目录/xxx.hprof:指定内存溢出时,dump 文件的生成路径,默认为当前目录。
  • -Xloggc:springboot-demo-gc-%t".log":指定 GC 日志的输出文件。

三、解析 GC 日志

在解析 GC 日志前,推荐一个在线解析 GC 日志的地址,我个人感觉比较好用:

  • GCeasy: https://gceasy.ycrash.cn/

在这里插入图片描述

当然,我们也可以完全自己进行分析。

GC 日志的格式和内容可以因 JVM 版本和 GC 算法的不同而会有所差异。下面是一个典型的 GC 日志示例:

2023-04-25T10:30:00.123+0800: 1.234: [GC (Allocation Failure) [PSYoungGen: 123456K->12345K(153600K)] 185432K->67890K(579200K), 0.0123456 secs] [Times: user=0.009876, sys=0.002468, real=0.012345]
  • 2023-04-25T10:30:00.123+0800:在2023年4月25日10点30分00.123秒(UTC+8时区)时,发生了一次GC。
  • [PSYoungGen: 123456K->12345K(153600K)]:GC前,新生代(PSYoungGen)使用了123456K内存,GC后减少到12345K。
  • 185432K->67890K(579200K), 0.0123456 secs:整个堆内存(包括老年代和新生代)GC前使用了185432K,GC后减少到67890K。GC持续了0.0123456秒。
  • [Times: user=0.009876, sys=0.002468, real=0.012345]:用户态CPU时间为0.009876秒,内核态CPU时间为0.002468秒,实际耗时为0.012345秒,最后这个是最重要的考察维度。

通过解析GC日志,我们可以了解GC的频率、持续时间、回收的内存量等信息,从而分析应用程序的内存使用情况和性能瓶颈。


四、优化建议

根据 GC 日志的分析结果,我们可以采取一些优化措施来提高应用程式的性能:

  1. 调整堆内存大小: 根据应用程序的实际需求,适当增加或减少堆内存的大小。
  2. 选择合适的 GC 算法: 不同的 GC 算法适用于不同的应用场景。根据 GC 日志的分析结果,选择最适合当前应用程序的 GC 算法。
  3. 优化代码: 减少对象的创建和长时间持有,避免内存泄漏等问题。
  4. 使用内存分析工具: 结合内存分析工具(如)

整理完毕,完结撒花~🌻





参考地址:

1.深入解析Java日志:如何开启JVM GC日志获取,https://developer.baidu.com/article/details/3210478
2.JVM 配置GC日志,https://blog.csdn.net/Coco_chun/article/details/120332428
3.【Java8】jvm 开启GC日志(ParNew+CMS),https://blog.csdn.net/smallbirdnq/article/details/132906468

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cisco ACI使用Postman配置交换机-未完待续

先看下不使用脚本的情况下是怎么配置交换机端口的? 例: 有10个交换机接口要开trunk,透传50个vlan, 使用GUI的操作方式为 1 进入EPG -->Static port 2 右键,绑定接口 3 选中node -->指定接口—>指定vlan —>…

Python SQL解析和转换库之sqlglot使用详解

概要 Python SQLGlot是一个基于Python的SQL解析和转换库,可以帮助开发者更加灵活地处理和操作SQL语句。本文将介绍SQLGlot库的安装、特性、基本功能、高级功能、实际应用场景等方面。 安装 安装SQLGlot库非常简单,可以使用pip命令进行安装: pip install sqlglot安装完成后…

我用这10招,能减少了80%的BUG

前言 对于大部分程序员来说,主要的工作时间是在开发和修复BUG。 有可能修改了一个BUG,会导致几个新BUG的产生,不断循环。 那么,有没有办法能够减少BUG,保证代码质量,提升工作效率? 答案是肯…

固定资产管理系统解决方案(Word原件)

固定资产管理系统解决方案 1系统概述 1.1需求描述 1.2需求分析 1.3重难点分析 1.4重难点解决措施 2系统架构设计 2.1系统架构图 2.2关键技术 3系统功能设计 3.1功能清单列表 3.2资产采购 3.3资产验收 3.4资产入库 3.5资产领用 3.6资产出库 3.7资产维修 3.8资产…

景区导览系统平台|智能导览|数字人导游|VR游园

随着人工智能、元宇宙等技术的飞速发展,文旅行业正迎来一场前所未有的变革。道可云文旅元宇宙平台以其独特的智慧景区导览系统、元宇宙空间以及数字人导游等创新应用,为景区和游客带来了全新的旅游体验,也标志着文旅行业正式步入了元宇宙时代…

超声波清洗机哪个品牌好?四款超值超声波清洗机汇总安利

在我们的日常生活中,眼镜已经成为了许多人不可或缺的伙伴,无论是度数眼镜还是防护眼镜,它们都为我们的生活带来了极大的便利。然而,随着频繁的使用,眼镜上积累的污渍和细菌也在悄悄增加,长时间不清洁不仅会…

CAD二次开发 快速选择插入其他项目块

需求:选择其他CAD文件,展示选择CAD文件中所有的块定义,然后选择需要插入的块,鼠标有块定义的跟随,点击放置块定义。 实现效果 代码 1.定义BlockJig拖拽类 public class BlockJig : EntityJig {private Point3d _curr…

开源项目|使用go语言搭建高效的环信 IM Rest接口(附源码)

项目背景 环信 Server SDK 是对环信 IM REST API 的封装, 可以节省服务器端开发者对接环信 API 的时间,只需要配置自己的 App Key 相关信息即可使用。 环信目前提供java和PHP版本的Server SDK,此项目使用go语言对环信 IM REST API 进行封装…

plsql developer 一键格式化sql/美化sql

PL/SQL 格式化工具 以 Oracle SQL Developer 为例,使用一键格式化的步骤如下: 打开 Oracle SQL Developer。在“文件”菜单中,选择“打开文件”,然后选择你的 PL/SQL 文件。打开文件后,你可以通过右键菜单选择“格式…

论文解读:(CoCoOP)Conditional Prompt Learning for Vision-Language Models

文章汇总 存在的问题 CoOp的一个关键问题:学习到的上下文不能推广到同一数据集中更广泛的未见类,这表明CoOp过拟合了训练期间观察到的基本类。 动机 为了解决弱泛化问题,我们引入了一个新的概念:条件提示学习。关键思想是使提示取决于每个输入实例(图…

RAG (Retrieval Augmented Generation) 结合 LlamaIndex、Elasticsearch 和 Mistral

作者:Srikanth Manvi 在这篇文章中,我们将讨论如何使用 RAG 技术(检索增强生成)和 Elasticsearch 作为向量数据库来实现问答体验。我们将使用 LlamaIndex 和本地运行的 Mistral LLM。 在开始之前,我们将先了解一些术…

【SpringBoot实战篇】登录认证

🍀🌸明确需求--接口文档--思路分析--开发--测试🌸🍀💕 1 明确需求 2 接口文档 登录 3 思路分析 UserServic、UserMapper在注册的时候已经实现 现在我们重点看UserController 控制器 4 开发(实现&#xff0…