【GC日志和OOM日志分析】JVM GC日志和OOM Dump文件分析

1 缘起

充电、充电、充电。
增加一些必备的知识,帮助后续使用。
请添加图片描述

2 配置JVM参数

为分析GC日志以及OOM相关信息,配置JVM参数,分为三个部分:
(1)堆内存,包括年轻代、最大堆内存;
(2)GC日志配置;
(3)OOM转存dump配置。
完整参数:
-Xmn10m -Xmx70m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\data\jvm

-Xmn10m -Xmx70m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\data\jvm

2.1 堆参数

参数描述
-Xmn10m年轻代分配10MB内存
-Xmx70m最大堆分配70MB内存,其中,最大堆内存=年轻代+老年代

2.2 GC日志参数

参数描述
-XX:+PrintGCDetails开启GC日志打印
-XX:+PrintGCDateStampsGC日志日期戳,格式: 2024-10-05T20:26:21.145+0800: 234.514
-Xloggc:./logs/gc.log指定GC日志输出文件路径

2.3 OOM dump转储参数

参数描述
-XX:+HeapDumpOnOutOfMemoryError开启OOM转储Dump文件
-XX:HeapDumpPath=D:\data\jvm配置Dump文件路径

开启GC日志并写入到指定目录下,添加启动参数:

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./logs/gc.log

启动服务后,在日志文件gc.log中查看GC内容如下,这里开启了时间戳(PrintGCDateStamps)。

3 GC分析

GC分析其实是分析GC日志内容,了解当前JVM GC状态,主要包括GC频率、回收内存大小,通过这些信息可以了解JVM状态。
依据这些状态,为我们优化JVM(主要是堆内存)提供理论数据支持,这里主要是解析GC日志参数并没有依据这些状态指导JVM调优
GC日志:
在这里插入图片描述

3.1 YGC

YGC日志如下,Allocation Failure说明分配内存失败,需要内存回收。
PSYoungGen:年轻代内存回收,
以第一行数据为例,
2024-10-05T20:25:28.185+0800: 181.555: [GC (Allocation Failure) [PSYoungGen: 7424K->192K(8704K)] 65370K->58146K(70144K), 0.0024832 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

2024-10-05T20:25:28.185+0800: 181.555: [GC (Allocation Failure) [PSYoungGen: 7424K->192K(8704K)] 65370K->58146K(70144K), 0.0024832 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

首先分析日志内容,各信息分析如下:
在这里插入图片描述

YGC回收频率以及内存回收大小可以通过JConsole或者Visual VM可视化,可视化的原始数据来自于GC日志。
每分钟YGC3~4次,每次回收内存:如4256K-96K=4160K=4MB。

在这里插入图片描述

2.2 Full GC

FullGC发生的情况是:年轻代已不足以为新对象分配内存+老年代仍不足以为新对象分配内存,触发Full GC,同时清理年轻代和老年代内存,Full GC直接影响系统的稳定性,我们要最大限度地减少Full GC(依据实际情况而定)。
Full GC日志如下:

2024-10-05T20:26:33.546+0800: 246.916: [Full GC (Ergonomics) [PSYoungGen: 4096K->0K(7168K)] [ParOldGen: 60327K->48792K(61440K)] 64423K->48792K(68608K), [Metaspace: 73978K->73972K(1116160K)], 0.0804215 secs] [Times: user=0.12 sys=0.00, real=0.08 secs]

Full GC各部分信息如下:

在这里插入图片描述

在模拟的请求中,主动触发Full GC,日志如下,
由日志可知,Full GC有两种情况:Ergonomics和Allocation Failure,当发生Full GC时,如果无法释放出足够内存给新对象使用,会一直进行Full GC,并抛出OOM异常,OOM异常会在Error日志中。

在这里插入图片描述

OOM Error日志,通过OOM日志,我们仅可知道发生了OOM,而无法确定发生OOM的位置,需要通过Dump文件分析。

在这里插入图片描述

4 OOM分析

通过GC日志,我们仅能了解到发生了Full GC,并不能直接定位到引发Full GC的位置,
最终导致无法定位引发OOM的原因,
因此,配置OOM发生后转储Dump文件,通过分析OOM Dump文件寻找引发OOM的原因。
通过异常日志可以直接发现发生OOM。
配置OOM Dump转储:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\data\jvm

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\data\jvm

4.1 OOM日志

当发生OOM时,日志中会给出异常日志,java.lang.OutOfMemoryError,
模拟OOM异常日志如下,配置OOM转储Dump文件,可以在指定的路径找到。
在这里插入图片描述

在这里插入图片描述

4.2 OOM Dump文件

通过Visual VM载入OOM Dump文件,文件后缀:hprof。

在这里插入图片描述

Visual VM载入hprof文件,步骤以及OOM信息如下:

在这里插入图片描述

通过OOM Error线程信息可以查看引发OOM的位置,位置信息如下,
这里的OOM信息是我在项目中模拟出来的,
位置是接口方法:testUserInfo,因此,我们可以分析这个接口的所有逻辑,找出OOM的原因,三类方案:
(1)增加年轻代和老年代内存;
(2)调整业务逻辑,优化数据拼装,减小内存占用;
(3)接口限流。

在这里插入图片描述

5 小结

(1)GC通过日志可以呈现的有:YGC和Full GC,其中,YGC中展示的信息中是新生代Eden区垃圾回收情况,并且Eden区和Survivor的比例是会发生变化的;Full GC展示的信息有新生代Eden区和老年代;
(2)OOM异常信息仅能提供发生了OOM,无法直接定位在哪里导致的OOM,需要通过Dump文件分析;
(3)配置GC日志和OOM转存参数:

参数描述
-XX:+PrintGCDetails开启GC日志打印
-XX:+PrintGCDateStampsGC日志日期戳,格式: 2024-10-05T20:26:21.145+0800: 234.514
-Xloggc:./logs/gc.log指定GC日志输出文件路径
-XX:+HeapDumpOnOutOfMemoryError开启OOM转储Dump文件
-XX:HeapDumpPath=D:\data\jvm配置Dump文件路径

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

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

相关文章

PELT算法

PELT算法的范畴 PELT算法(Pruned Exact Linear Time)属于时间序列分析和变点检测(Change Point Detection)范畴的算法。 从更广泛的角度来看,PELT算法还可以归类为以下几类算法的子集: 1. 时间序列分析&…

初识Linux · 文件(1)

目录 前言: 回顾语言层面的文件 理解文件的预备知识 文件和磁盘 使用和认识系统调用函数 前言: 本文以及下篇文章,揭露的都是Linux中文件的奥秘,对于文件来说,初学Linux第一节课接触的就是文件,对于C…

COMP 9517 Computer Vision week3

目录 特征表示图像特征概念(image feature)图像特征应该具备的属性 图像特征种类颜色特征颜色直方图(Color Histogram)颜色矩(Colour moments) 纹理特征(texture features)Haralick特征局部二值模式(Local Binary Patterns, LBP)尺度不变特征变换SIFT(Scale-invariant feature …

Error while loading conda entry point: conda-libmamba-solver

问题 解决方法 conda install --solverclassic conda-forge::conda-libmamba-solver conda-forge::libmamba conda-forge::libmambapy conda-forge::libarchive

如何实现事件流操作

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了通道相关的内容,本章回中将介绍StreamProvider组件.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 在Flutter中Stream是经常使用的组件,对该组件的监听可void main() {///让状态栏和程序的appBar融为一体…

zotero WebDAV同步忘记密码

https://www.jianguoyun.com/#/safety 找到应用密码

thinkphp 学习记录

1、PHP配置 (点开链接后,往下拉,找到PHP8.2.2版本,下载的是ZIP格式,解压即用) PHP For Windows: Binaries and sources Releases (这里是下载地址) 我解压的地址是:D:\…

Gitlab flow工作流

Gitlab flow Gitlab flow 是 Git flow 与 Github flow 的综合。它吸取了两者的优点,既有适应不同开发环境的弹性,又有单一主分支的简单和便利。它是 Gitlab.com 推荐的做法。 1 上游优先 Gitlab flow 的最大原则叫做"上游优先"(…

【408计算机考研课程】数据结构-数据结构在学什么?

前言 数据结构在学什么? 如何用程序代码把现实世界的问题信息化如何用计算机高效地处理这些信息从而创造价值 第一章:数据结构在学什么? 总览 什么是数据? 简介:数据是信息的载体,是描述客观事物属性的数、…

el-pagination组件封装

组件使用 源代码&#xff1a; <script setup> import Pagination from /components/pagination/index.vue import {ref} from "vue";const pageNum ref(1) const pageSize ref(10) const total ref(120)function loadData() {// 加载数据 } </script>…

拓扑排序简介

拓扑排序(Topological Sort)是一种重要的图算法,用于对有向无环图(DAG, Directed Acyclic Graph)中的节点进行排序。拓扑排序的结果是一种线性序列,使得对于图中的任意一条有向边(u, v),顶点u都在顶点v之前。这种排序常用于任务调度、编译器依赖关系分析等领域。 拓…

24个AI写作秘技,助你写出震撼人心的佳作!

最近&#xff0c;许多朋友开始尝试使用AI进行写作。然而&#xff0c;他们创作的文章常常显得语言过于正式&#xff0c;不仅缺乏沉浸感&#xff0c;发送后也很容易被系统检测出重复内容。我一直强调&#xff0c;在写作过程中&#xff0c;我们不应完全依赖AI。AI只是一种工具&…

【C语言】分支与循环

文章目录 前言if语句关系操作符逻辑操作符&#xff1a;&& , || , &#xff01;switch语句if语句和switch语句的对比 while循环for循环do-while循环break和continue语句循环嵌套goto语句 前言 C语⾔是结构化的程序设计语⾔&#xff0c;这⾥的结构指的是顺序结构、选择&…

12条职场经验总结

01 事干得好不好尚且不说&#xff0c;但是话一定要说得漂亮。 比如&#xff0c;当领导给你安排工作的时候&#xff0c;你一定要非常积极地响应&#xff0c;拍着胸脯跟领导说“放心吧”。至于后续到底怎么干&#xff0c;再结合实际情况有的放矢地把握。 02 当别人夸奖你的时…

Hugging Face 任意大模型仓库劫持 - 无声的破坏

摘要 在这篇博客中&#xff0c;我们展示了攻击者如何攻击Hugging Face的Safetensors转换空间及其相关的服务机器人。这些服务是一个在Hugging Face上广受欢迎的服务&#xff0c;专门用于将不安全的机器学习模型转换为更安全的版本。我们随后展示了如何通过Hugging Face自身的服…

GoogleNet原理与实战

在2014年的ImageNet图像识别挑战赛中&#xff0c;一个名叫GoogLeNet 的网络架构大放异彩。以前流行的网络使用小到11&#xff0c;大到77的卷积核。本文的一个观点是&#xff0c;有时使用不同大小的卷积核组合是有利的。 回到他那个图里面你会发现,这里的一个通过我们最大的池化…

《Linux从小白到高手》理论篇:Linux用户和组相关的命令

List item 本篇介绍Linux用户和组相关的命令&#xff0c;看完本文&#xff0c;有关Linux用户和组相关的常用命令你就掌握了99%了。Linux用户和组相关的命令可以分为以下六类&#xff1a; 一.用户和用户组相关查询操作命令&#xff1a; Id id命令用于显示用户的身份标识。常见…

职场中的10个“人情世故”,随处可见

职场上&#xff0c;“现实”是主基调。如果不通#人情世故#&#xff0c;可能举步维坚。很多时候&#xff0c;人情世故并不是什么高深的学问&#xff0c;就是在点点滴滴间&#xff0c;只要稍加注意&#xff0c;就能学通。下面这10条&#xff0c;是职场很常见的人情世故。 1、登门…

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读幻行问题可重复读MVCC会出…

HTB:Synced[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What is the default port for rsync? 2.How many TCP ports are open on the remote host? 3.What is the protocol version used by rsync on the remote machine? 4.What is the most common command name on Linux to interact w…