当前位置: 首页 > news >正文

【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文件路径

相关文章:

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

1 缘起 充电、充电、充电。 增加一些必备的知识,帮助后续使用。 2 配置JVM参数 为分析GC日志以及OOM相关信息,配置JVM参数,分为三个部分: (1)堆内存,包括年轻代、最大堆内存; &a…...

【电路】1.1 实际电路和电路模型

1.1 实际电路和电路模型 科学理论的研究对象是现实世界背后的抽象世界,如: 数学中的 ∞ \infty ∞,经典力学中“质点”的概念,牛顿运动定律(如惯性定律,如果一个物体不受外力情况下,一直保持匀…...

Vue - 打包部署

vscode找到NPM脚本,点击build。 目录下出现dist目录则表示安装成功。 安装Nginxnginx: download 目录用途conf配置文件目录html静态资源文件目录logs日志文件目录temp临时文件目录 将刚刚打包好的文件放到html目录下。 点击nginx.exe,用localhost:默认…...

spring揭秘25-springmvc03-其他组件(文件上传+拦截器+处理器适配器+异常统一处理)

文章目录 【README】【1】文件上传与MultipartResolver【1.1】使用MultipartResolver进行文件上传【1.2】springmvc处理multipart多部件请求流程【1.3】使用springmvc上传文件代码实现(springmvc6.10版本): 【2】Handler与HandlerAdaptor&…...

springboot项目中属性的使用优先级;maven编译插件切换环境变量

概述 在项目部署时,相关的生产环境和测试环境是分开的,但是代码是同一套; 所以一般会有多套变量; 项目中默认变量(一般是测试环境) 线上变量(线上数据较敏感,一般也不会放在代码中&…...

【Qt】控件概述 (1)—— Widget属性

控件概述 1. QWidget核心属性1.1核心属性概述1.2 enable1.3 geometry——窗口坐标1.4 window frame的影响1.4 windowTitle——窗口标题1.5 windowIcon——窗口图标1.6 windowOpacity——透明度设置1.7 cursor——光标设置1.8 font——字体设置1.9 toolTip——鼠标悬停提示设置1…...

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第3关---浦语提示词工程实践

学员闯关手册:https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频:https://www.bilibili.com/video/BV1cU411S7iV/ 课程文档: https://github.com/InternLM/Tutorial/tree/camp3/docs/L1/Prompt 关…...

OpenCV视频I/O(11)视频采集类VideoCapture之设置视频捕获设备的属性函数 set()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 VideoCapture 中设置一个属性。 在OpenCV中,cv::VideoCapture::set() 函数用于设置视频捕获设备的属性。这些属性可以包括分辨率、…...

数据结构之树(3)

一、森林和树的转换 重要! 树->二叉树 由于孩子兄弟链式存储和二叉树链式存储本质相同,故树可转换为二叉树。 森林->二叉树 森林:m棵互不相交的树的集合 森林->树 树->二叉树 森林中各个树的根节点之间视为兄弟关系 二、树…...

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下docker学习02(yum源切换及docker安装配置)

2 前期工作 2.1 切换yum源并更新 删除/etc/yum.repos.d/原有repo文件,将Centos-7.repo库文件拷贝到该目录下。 然后清楚原有缓存yum clean all 生成新的缓存yum makecache 更新yum update –y 然后再确认/etc/yum.repos.d/不会有其他库文件,只留下…...

强化学习笔记之【Q-learning算法和DQN算法】

强化学习笔记(一)——Q-learning和DQN算法核心公式 文章目录 强化学习笔记(一)——Q-learning和DQN算法核心公式前言:Q-learning算法DQN算法 前言: 强化学习领域,繁冗复杂的大段代码里面&#…...

面试经验02

嵌入式简历制作指南与秋招求职建议 引言 秋招季即将到来,许多同学开始准备求职简历。无论你是考研失利准备就业,还是即将毕业寻找实习,一份优秀的简历都是求职的敲门砖。今天,我们将讨论如何制作嵌入式领域的求职简历&#xff0…...

分层图 的尝试学习 1.0

分层图: 分层图的最短路: 又叫做 扩点最短路。不把实际位置看做是图上的点,而是把实际位置及其状态的组合,(一个点有若干的状态,所以一个点会扩充出来若干点)看做是图上的点,然后搜索…...

第 31 章 javascript 之 XPath

第 31 章 XPath 1.IE 中的 XPath 2.W3C 中的 XPath 3.XPath 跨浏览器兼容 XPath 是一种节点查找手段,对比之前使用标准 DOM 去查找 XML 中的节点方式,大大降低了查找难度,方便开发者使用。但是,DOM3 级以前的标准并没有就 XPa…...

JavaScript中的高阶函数

高阶函数 所谓高阶函数,就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个新函数: 来看一个mapper()函数,将一个数组映射到另一个使用这个函数的数组上: 更常见的例子,它接收两个函…...

Qt6.7开发安卓程序间接连接到MySQL的方法

本文主要描述一种通过间接的方法,使得Qt开发的安卓程序可以直连到Mysql数据库的方法。本文章的方案是通过JAVA代码去连接MySQL数据库,然后C代码去调用JAVA的方法,从而实现QT开发的安卓程序去直连到MySQL数据库。 本文使用 JDBC 结合 JNI&…...

ROW_NUMBER

How to rewrite a query which uses the ROW_NUMBER() window function in versions 5.7 or earlier before window functions were supported e.g., SELECT ROW_NUMBER() OVER (PARTITION BY fieldA) AS rownum, myTable.* FROM myTable; index 用不上的 Solution Assuming…...

Docker技术

目录 Docker的基本概念 Docker的核心原理 Docker的使用场景 Docker的优点 Docker的挑战 为什么使用 环境一致性 快速启动和部署 资源利用率高 支持微服务架构 持续集成与持续交付(CI/CD) 依赖管理 简化部署流程 高效资源管理 生态系统丰富…...

中小企业做网站需要考虑哪些因素?

中小企业在建设网站时,需要考虑的因素有很多。以下是一些主要考虑因素的介绍: 明确建站目的:中小企业需要明确自己建立网站的目的。是为了展示企业形象、推广产品,还是提供客户服务?不同的目的将决定网站的设计和功能…...

【d60】【Java】【力扣】509. 斐波那契数

思路 要做的问题:求F(n), F(n)就等于F(n-1)F(n-2),要把这个F(n-1)F(n-2)当作常量,已经得到的值, 结束条件:如果是第1 第2 个数字的时候,没有n-1和n-2,所以…...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...