记生产OOM的故障分析

一、引言

生产上告警,交易堵塞,服务无响应,使用jstack、jmap、jhat命令进行故障分析。

Java虚拟机(Java Virtual Machine,简称JVM)作为Java语言的核心组件,为Java程序提供了运行环境和内存管理机制。本文将系统地介绍JVM的基本架构、工作原理以及相关实战案例,旨在帮助读者对JVM有更全面且深入的理解。

二、JVM概述

JVM是Java平台的一部分,负责将Java字节码转换为机器指令并在不同的操作系统上执行。它屏蔽了底层硬件和操作系统的差异,使得“一次编写,到处运行”的理念得以实现。

三、JVM架构

四、垃圾回收

使用jstat 查看内存变化情况以及垃圾回收次数、时间,可以看到Eden的内存满了之后,就会做一次YGC,老年代的内存满了之后,会做FGC。

jstat -gcutil 1992 1000 1000

代码如下:

import java.util.HashMap;
import java.util.Map;/*** @Author: thinkpad* @Date: 2024-02-04 22:19*/
public class GCDemo {public static void main(String[] args) throws InterruptedException {Thread.sleep(10000);Map gc1Map = new HashMap();Map gc2Map = new HashMap();for(int i = 0; i < 10000; i++){// 每个byte占1字节,所以为了得到1M需要大约1024 * 1024个字节int oneMegabyte = 1024 * 1024;// 创建一个1MB的byte数组byte[] largeObject = new byte[oneMegabyte];gc1Map.put(i, largeObject);gc2Map.put(i, largeObject);System.out.println("i = " + i);Thread.sleep(200);}}
}

五、实战案例

本次生产上的故障是由于使用POI进行Excel操作所引起的,现在,我们来分析POI导致的原因。

生产上的故障,使用XSSFWorkbook操作十几万条记录,代码大致如下:

import org.apache.commons.compress.utils.Lists;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File;
import java.util.List;/*** @Author: thinkpad* @Date: 2024-02-24 21:53*/
public class XssfWorkbookDemo {public static void main(String[] args) {try {File testcaseFile = new File("E:/testcase.xlsx");XSSFWorkbook xssfWorkbook = new XSSFWorkbook(testcaseFile);XSSFSheet sheet = xssfWorkbook.getSheetAt(0);List<TestCase> testCaseList = Lists.newArrayList();int lastRowNum = sheet.getLastRowNum();System.out.println("lastRowNum: " + lastRowNum);for(int rowIndex = 1; rowIndex <= lastRowNum; rowIndex++){XSSFRow row = sheet.getRow(rowIndex);String[] cellArray = new String[row.getLastCellNum() - row.getFirstCellNum()];for(int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++){cellArray[cellNum] = row.getCell(cellNum).toString();}TestCase testCase = new TestCase();testCase.setCaseId(cellArray[0]);testCase.setUrl(cellArray[1]);testCase.setLevel(cellArray[2]);testCase.setDescribe(cellArray[3]);testCaseList.add(testCase);}testCaseList.stream().forEach(testcase->{System.out.println(testcase.toString());});}catch (Exception e){e.printStackTrace();}}
}

导致内存溢出,通过jmap和jhat分析,使用jmap导出内存,命令如下

jmap -dump:live,format=b,file=heap-dump-pid.bin pid

通过jhat分析,关注 show heap histogram(内存实例的分布)

通过show heap histogram分析,发现内存占用多的如下分布, org.apache.xmlbeans.impl.store.Xobj占用了大量的内存,这是因为使用POI读取excel时,会产生大量的xml解析,因此如果有很多记录时,就会导致内存溢出。

 由于使用XSSFWorkbook读取大量excel记录时,会内存溢出,因此尝试SXSSFWorkbook读取excel,代码大致如下

package com.fd.demo;import org.apache.commons.compress.utils.Lists;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File;
import java.io.FileInputStream;
import java.util.List;/*** @Author: thinkpad* @Date: 2024-02-24 21:53*/
public class SXssfWorkbookDemo {public static void main(String[] args) {try {File testcaseFile = new File("E:/testcase.xlsx");FileInputStream fis = new FileInputStream(testcaseFile);XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fis);SXSSFWorkbook workbook = new SXSSFWorkbook(xssfWorkbook, 1000);Sheet sheet = workbook.getXSSFWorkbook().getSheetAt(0);List<TestCase> testCaseList = Lists.newArrayList();int lastRowNum = sheet.getLastRowNum();System.out.println("lastRowNum: " + lastRowNum);for(int rowIndex = 1; rowIndex <= lastRowNum; rowIndex++){Row row = sheet.getRow(rowIndex);String[] cellArray = new String[row.getLastCellNum() - row.getFirstCellNum()];for(int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++){cellArray[cellNum] = row.getCell(cellNum).toString();}TestCase testCase = new TestCase();testCase.setCaseId(cellArray[0]);testCase.setUrl(cellArray[1]);testCase.setLevel(cellArray[2]);testCase.setDescribe(cellArray[3]);testCase.setDescribe1(cellArray[4]);testCase.setDescribe2(cellArray[5]);testCase.setDescribe3(cellArray[6]);testCase.setDescribe4(cellArray[7]);testCase.setDescribe5(cellArray[8]);testCase.setDescribe6(cellArray[9]);testCase.setDescribe7(cellArray[10]);testCase.setDescribe8(cellArray[11]);testCase.setDescribe9(cellArray[12]);testCase.setDescribe10(cellArray[13]);testCase.setDescribe11(cellArray[14]);testCase.setDescribe12(cellArray[15]);testCase.setDescribe13(cellArray[16]);testCase.setDescribe14(cellArray[17]);testCase.setDescribe15(cellArray[18]);testCase.setDescribe16(cellArray[19]);testCase.setDescribe17(cellArray[20]);testCase.setDescribe18(cellArray[21]);testCaseList.add(testCase);}for(int i = 0; i < testCaseList.size(); i++){System.out.println(testCaseList.get(i).toString());}Thread.sleep(1000000);}catch (Exception e){e.printStackTrace();}}
}

 导致内存溢出,通过jmap和jhat分析,使用jmap导出内存,命令如下

jmap -dump:live,format=b,file=heap-dump-pid.bin pid

通过jhat分析,关注 show heap histogram(内存实例的分布)

六、总结

内存溢出的分析需要用到jmap,jhat命令

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

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

相关文章

docker存储驱动

目录 一、写时复制和用时分配 二、联合文件系统 2.1、aufs ​编辑 2.2、分层的问题 2.3、overlay 2.4 文件系统区别 三、容器跑httpd案例 3.1、案例1&#xff1a;端口映射 3.2、案例2&#xff1a;制作httpd应用镜像 3.3、案例3&#xff1a;docker数据卷挂载 3.4、案…

【hot100】跟着小王一起刷leetcode -- 49. 字母异位词分组

【【hot100】跟着小王一起刷leetcode -- 49. 字母异位词分组 49. 字母异位词分组题目解读解题思路代码实现 总结 49. 字母异位词分组 题目解读 49. 字母异位词分组 ok&#xff0c;兄弟们&#xff0c;咱们来看看这道题&#xff0c;很明显哈&#xff0c;这里的关键词是字母异位…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-27-处理单选和多选按钮-番外篇

1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo&#xff0c;然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何使用playwright来处理单选按钮和多选按钮进行自动化测试&#xff0c;想必大家都已经掌握的八九不离十了吧。这一篇其实也很简单&#xff1a…

浅谈 TCP 三次握手

文章目录 三次握手 三次握手 首先我们需要明确&#xff0c;三次握手的目的是什么&#xff1f; 是为了通信双方之间建立连接&#xff0c;然后传输数据。 那么建立连接的条件是什么呢&#xff1f; 需要确保通信的双方都确认彼此的接收和发送能力正常&#xff0c;满足这个条件&a…

今天面了个字节拿 38K 出来的测试,让我见识到了基础的天花板

最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备金九银十的面试计划。 作为一个入职5年的老人家&#xff0c;目前工资比较乐观&#xff0c;但是我还是会选择跳槽&#xff0c;因为感觉在一个舒适圈待久了&#xff0c;人过得太过安逸&#xff0c;晋升涨…

Jeecg项目部署

说明&#xff1a;Jeecg是一款低代码开发平台&#xff0c;简单说是一款现成的项目&#xff0c;该项目集成了许多功能&#xff0c;我们可以在这个项目之上开发自己的业务代码。 本文介绍Jeecg项目的部署&#xff0c;包括后端jeecg-boot项目、前端vue3项目。前端项目在本地Window…

Java的编程之旅19——使用idea对面相对象编程项目的创建

在介绍面向对象编程之前先说一下我们在idea中如何创建项目文件 使用快捷键CtrlshiftaltS新建一个模块&#xff0c;点击“”&#xff0c;再点New Module 点击Next 我这里给Module起名叫OOP,就是面向对象编程的英文缩写&#xff0c;再点击下面的Finish 点Apply或OK均可 右键src…

2024Python自动化测试面试必备知识点!

在准备 Python 自动化测试面试时&#xff0c;以下是一些必备的知识点&#xff0c;可以帮助您在面试中展现实力&#xff1a; 软件测试基础&#xff1a; 熟悉软件测试的基本概念&#xff0c;包括测试类型&#xff08;功能测试、性能测试、安全测试等&#xff09;、测试方法&#…

数据安全治理实践路线(中)

数据安全建设阶段主要对数据安全规划进行落地实施&#xff0c;建成与组织相适应的数据安全治理能力&#xff0c;包括组织架构的建设、制度体系的完善、技术工具的建立和人员能力的培养等。通过数据安全规划&#xff0c;组织对如何从零开始建设数据安全治理体系有了一定认知&…

微服务篇之任务调度

一、xxl-job的作用 1. 解决集群任务的重复执行问题。 2. cron表达式定义灵活。 3. 定时任务失败了&#xff0c;重试和统计。 4. 任务量大&#xff0c;分片执行。 二、xxl-job路由策略 1. FIRST&#xff08;第一个&#xff09;&#xff1a;固定选择第一个机器。 2. LAST&#x…

西门子S7-1500作为智能设备共享功能

本章节介绍了共享设备的功能&#xff0c;优势&#xff0c;使用要求&#xff0c;使用规则&#xff0c;如何将智能设备作为共享设备&#xff0c;实现一个智能设备同时与2个IO控制器进行通信的示例&#xff0c;以及常见问题。 一、共享设备功能概述 信号模块可以被不同的IO控制器…

【MIT-PHP-推荐】imi-ai 是一个 ChatGPT 开源项目

mi-ai 是一个 ChatGPT 开源项目&#xff0c;支持聊天、问答、写代码、写文章、做作业等功能。 项目架构合理&#xff0c;代码编写优雅&#xff0c;简单快速部署。前后端代码完全开源&#xff0c;不管是学习自用还是商用二开都很适合。 本项目现已支持 ChatGPT 聊天 AI 和 Emb…

都说了别用BeanUtils.copyProperties,这不翻车了吧

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 故事 新年新气象&#xff0c;小猫也是踏上了新年新征程&#xff0c;自从小猫按照老猫给的建议【系统梳理大法】完完整整地梳理完毕系统之后&#xff0c;小猫对整个系统的把控可谓又是上到可一个新的高度。…

yolov8学习笔记(二)模型训练

目录 yolov8的模型训练 1、制作数据集&#xff08;标记数据集&#xff09; 2、模型训练&#xff08;标记数据集、参数设置、跟踪模型随时间的性能变化&#xff09; 2.1、租服务器训练 2.2、加训练参数 2.3、看训练时的参数&#xff08;有条件&#xff0c;就使用TensorBoard&…

Open CASCADE学习|视图

目录 Mainwin.h Mainwin.cpp Mainwin.h ​#pragma once#include <QtWidgets/QMainWindow>#include "Displaywin.h"#include "OCC.h"class Mainwin : public QMainWindow{ Q_OBJECTpublic: Mainwin(QWidget* parent nullptr); ~Mainwin();​pri…

【Java程序设计】【C00277】基于Springboot的招生管理系统(有论文)

基于Springboot的招生管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的招生管理系统 本系统分为系统功能模块、管理员功能模块以及学生功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页、专业…

opengl 学习纹理

一.纹理是什么&#xff1f; 纹理是一个2D图片&#xff08;甚至也有1D和3D的纹理&#xff09;&#xff0c;它可以用来添加物体的细节&#xff1b;类似于图像一样&#xff0c;纹理也可以被用来储存大量的数据&#xff0c;这些数据可以发送到着色器上。 采样是指用纹理坐标来获取纹…

机器学习简单介绍

&#xff08;本文为简单介绍&#xff0c;内容源于网络和AI&#xff09; 当今世界,技术与创新的步伐日新月异。在各类智能技术当中,如果说有一个绝对不容忽视的关键词,那就是“机器学习”(Machine Learning)。它是人工智能领域的核心分支,使得机器获得从数据中学习、进而做出决…

Modern C++ std::variant的6个特性+原理

1 前言 上一节《Modern C std::variant的实现原理》我们简单分析了std::variant的实现原理&#xff0c;其实要学好C编程&#xff0c;除了看优秀的代码包括标准库实现&#xff0c;读文档也是很便捷且必须的一种办法。 本节我将逐条解析文档中的五个特性&#xff0c;解析的办法有…

H12-821_77

77.如图所示的交换网络&#xff0c;所有交换机都运行了STP协议&#xff0c;当拓扑稳定后&#xff0c;在以下哪台交换机上修改配置BPDU的发送周期&#xff0c;可以影响STD配置BPDU的发送周期&#xff1f; A.STC B.SWD C.SWA D.SWB 答案&#xff1a;C 注释&#xff1a; 在根桥上…