JVM实战-2023线上项目突发OOM以及快速定位解决全过程

news2024/11/13 15:56:02

现象描述:

        用户在进行报表下载过程中,每隔几天系统就会报错500,导致无法进行报表下载。

原因分析:

通过查看系统log日志以及gc日志,发现是因为下载报表过程中JVM频繁进行Full GC,而且老年代的堆内存不断增加且无法回收,最终导致OOM。

问题排查:

  1. 审查代码,发现存在很多共用的变量位于for循环之中
  2. 出现OOM可能存在如下问题
  •  JVM堆内存设置偏小
  • 程序中存在大对象无法回收

解决方案:

  1. 将公共变量提取到for循环外面共用(可以减少对象创建,但不是导致OOM的核心)
  2.    a. 将原先内存扩大一倍(系统正常使用时长比原先多几天,但最终仍会报OOM)

b. 通过工具分析堆内存快照,定位到代码中存在大对象

排查中核心过程:

查看项目日志文件

应用日志文件:显示Java Heap OutOfMemory错误

GC日志文件:新生代/老年代内存均占满,且进行Full GC内存无变化,导致OOM

GC日志

导出堆快照Dump.hprof二进制文件

注意: 使用jdk自带的jpsjmap命令(jdk必须是完整的,不能是简化版的,jdk/bin下有jpsjmap,否则不支持相关命令)

 1.jps –l该命令显示本地所有的正在运行的服务信息,包括进程id和服务名称

2.使用该服务功能后,通过jmap -dump:file=C:/tmp/dump.hprof 4672 导出对应进程ID(4672)的堆快照文件到指定的位置(C:/tmp/)

3.使用Jprofiler工具分析堆内存快照文件

  1. 首先下载jprofiler工具到本地并安装成功
  2. 使用jprofiler打开此前生成的dump.hprof二进制文件

        3.选择其中的Biggest Objects选项栏位,并从大到小排列显示堆内存中对象

可以看到各个对象内存占比

         4. 我们会发现workbook该对象大小占比55%,显然是个超大对象,因此我们需要检查该对象在执行完成后是否释放

修改代码

  1. 根据代码审查,发现该对象使用完后并未及时释放,导致该对象一致被引用且大小不断增大导致最终不断Full GC且内存无法释放,形成OOM现象。
  2. 在原有功能代码执行完成后调用workbook.close()方法释放对象引用

将修改后的代码打包上传到私服Nexus仓库

如下截图为通过STS工具将本地项目打jar包推送到nexus仓库中的流程

注意:maven命令为cleandeploy; jre需要选择本地的jdk目录

推送成功

如果没有执行mvn install指令,后续需要重新执行此命令,更新maven引用后其他引用此包的代码才不会报找不到该包下的方法错误

重新发布并部署项目,查看GC日志,显示GC正常

查看线上项目GC情况

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

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

相关文章

chatgpt赋能python:Python彻底删除指南:为什么需要彻底删除Python?

Python彻底删除指南:为什么需要彻底删除Python? Python是一种高级编程语言,它广泛用于各种应用程序的开发。但是,对于某些开发者来说,可能需要从他们的计算机中彻底删除Python。这可能是因为他们需要将Python版本更新…

Linux--打印内容或者插入内容:echo

语法: echo 内容 作用:打印内容到显示器echo 内容 > 不存在的文件 作用:文件创建,并将内容插入新创建的文件中echo 内容 > 存在的文件 作用:覆盖文件原有的内容 echo 内容 >> 存在的文件 作用&#xff1a…

Redis的持久化机制(2)

AOF 以独立日志的方式记录每次写命令(读操作不记录),重启时再重新执行AOF文件中的命令来恢复数据。AOF会先把命令追加在AOF缓冲区,然后根据对应策略写入硬盘(appendfsync),它只许追加文件但不可…

【vue:淘宝rem自适应 】

vue:淘宝rem自适应 1.安装lib-flexible:cnpm install lib-flexible --save 2.在main.js中引入:import lib-flexible/flexible.js’ 3.配置flexible找到vue-cli路径node_modules/lib-flexible/flexible.js,然后修改rem换算单位 4.配置px to re…

ThreadLocal-线程安全利器

原文链接:https://www.jylt.cc/#/detail?activityIndex2&id9df3fd62d6ee13ff555c30157798b092 ThreadLocal是什么 ThreadLocal用来提供线程内部的局部变量,是各个线程独有的,该变量无法被其他线程访问。主要有以下作用: 解…

pyqt5实现线程与弹窗功能

pyqt5实现线程与弹窗功能 效果图: 示例下载 点我下载 https://download.csdn.net/download/lm_is_dc/87982279 简介 Pyqt5线程使用 QThread, pyqtSignal, QMutex, QWaitCondition来实现,涉及到线程,锁,信号量,线程…

深入理解计算机系统(2)_计算机基本组成

深入理解计算机系统系列文章目录 第一章 计算机的基本组成 1. 内容概述 2. 计算机基本组成 第二章 计算机的指令和运算 第三章 处理器设计 第四章 存储器和IO系统 文章目录 深入理解计算机系统系列文章目录前言参考资料一、组成架构(冯/图)1. 组成架构2…

42. 接雨水

题目链接:力扣 解题思路:从左往右按列进行计算,依次计算每一列能够接到的雨水数量。对于当前列能够接到的雨水数量是由左右两边最高的两根柱子决定的,类似于木桶定律(一只水桶能装多少水取决于它最短的那块木板&#x…

AI实践-定制你的专属简历-软件测试

简历对于找到一份理想的工作至关重要。但是,准备简历这一过程却让人感到头疼和繁琐,而且如何突出自己的优势,也是许多求职者遇到困惑。 chatgpt不会受到情感和个人喜好的影响,能够通过算法和数据分析为您编写最合适的简历。并且可…

目标检测算法-YOLOV5解析(附论文与源码)

目标检测算法-YOLOV5解析(附论文与源码)

数据结构 | 顺序二叉树

一、数据结构定义 1、顺序二叉树 /* 顺序二叉树 */ typedef char TreeType; typedef struct seqTree{int MAXNUM; // 最大元素个数int curNum; // 元素的个数TreeType nodelist[]; // 顺序二叉树节点存储 } *SeqTree; 本次代码中二叉树的结构如下图,用层次序列可…

【Python】字典

文章目录 一. 字典的创建二. 字典的操作1. 查找 key2. 新增键值对3. 删除键值对4. 遍历字典4.1 使用 for 循环遍历字典4.2 通过方法遍历字典keys() 获取到字典中所有 keyvalues() 获取到字典中的所以 valueitems 获取到字典中的所有键值对 三. 理解字典操作的效率 一. 字典的创…

Linux--打印文件内容:cat

cat是cater的简写 语法: cat [选项] [文件] 常用选项: -b 对非空输出行编号 -n 对输出的所有行编号 -s 不输出多行空行 示例: ①打印文件hello.c的内容 ②带行号打印文件hello.c的内容 ③输入什么,打印什么 ④输入重定向&…

讲座笔记:如何撰写高质量科技论文

1 论文总体思路 2 摘要 3 Intro 常见Introduction逻辑: 说明问题是什么;简单罗列前人工作;描述我们的工作。 说明问题是什么;目前最好的工作面临什么挑战;我们的方法能缓解上述挑战 3.1 段落写法 首先列出几句话 …

【 Linux】文件删除原理

文章目录 Linux文件删除原理文件的索引节点和链接文件删除的过程文件删除后是否能恢复 Linux文件删除原理 Linux是一个强大的操作系统,它提供了许多命令和工具来管理文件和目录。其中,最常用的命令之一就是rm,它可以用来删除不需要的文件或目…

Less简明教程

一.概述 Less是一种动态样式语言,它在CSS的基础上扩展了混合、嵌套、变量等实用功能。Less也是一种CSS预处理语言,less文件在经过less.js处理后,最终会生成.css文件,如下图所示: 1.动态样式语言的比较 动态样式语言主…

git push报错rejected:no-fast-forward

报错: 报错关键词: non-fast-forwardyour current branch is behindthe remote changes 即:不能快速前进、当前分支滞后、远端改变 原因: 这个分支下,别人提交了一些代码到远程仓库。对于这个改变,你没有…

SpringBoot+微信小程序在线订餐小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBoot微信小程序框架开发的在线订餐小程序系统。首先,这是一个前后端分离的项目,代…

什么是 Kubernetes 服务器端应用 (SSA)?

自 2021 年 8 月 v1.22 版本发布以来,服务器端应用 (SSA) 已在 Kubernetes 中普遍可用。这是一种声明式资源管理策略,可通过将命令逻辑移至kubectl apply服务器来改进 diff 计算并警告合并冲突。 本文将解释 SSA 的工作原理以及为什么它比以前的客户端应用 (CSA) 方法更受青…

Python3 面向对象 | 菜鸟教程(十六)

目录 一、面向对象技术简介 (一)类(Class) (二)方法 (三)类变量 (四)数据成员 (五)方法重写 (六)局部变量 (七&am…