【Java系列】OOM 时,JVM 堆栈信息保存和分析

一、前言

在日常开发中,即使代码写得再谨慎,免不了还是会发生各种意外的事件,比如服务器内存突然飙高,又或者发生内存溢出(OOM)。当发生这种情况时,我们怎么去排查,怎么去分析原因呢?

一般遇到这种情况,都是需要 dump JVM 堆栈信息来进行排查和分析。

二、JVM 堆栈信息保存方式

这里介绍两种 dump JVM 堆栈信息的方式,一种是被动的(自动保存),一种是主动的(手动保存)。

2.1 自动保存

其实在很多时候我们是不知道何时会发生 OOM,所以需要在发生 OOM 时自动生成 dump 文件。怎么做?

很简单,JVM 增加如下参数即可:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/jvm/heapdump.hprof

附上笔者完整的 JVM 参数(JDK 1.8):

-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
-Xms2g
-Xmx2g
-Xss256k
-XX:+UseG1GC
-XX:MaxGCPauseMillis=50
-XX:+UnlockExperimentalVMOptions
-XX:+UseCGroupMemoryLimitForHeap
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/var/log/jvm/heapdump.hprof
参数描述
-XX:MetaspaceSize=256m设置元空间(Metaspace)的初始大小为256MB。元空间用于存储类和方法信息等数据
-XX:MaxMetaspaceSize=512m设置元空间的最大大小为512MB。如果元空间需要更多空间,JVM 将动态扩展元空间的大小,但不会超过这个最大值
-Xms2g设置Java虚拟机的初始堆大小为2GB。这是堆的初始可用空间
-Xmx2g设置Java虚拟机的最大堆大小为2GB。这是堆的最大可用空间
-Xss256k设置每个线程的栈大小为256KB。栈大小影响可以创建的线程数量,太小可能会导致 StackOverflowError,太大则会消耗更多内存
-XX:+UseG1GC启用G1垃圾收集器。G1是Java 7及之后版本引入的一种垃圾收集器,目标是取代CMS收集器,提供更可控的垃圾收集性能
-XX:MaxGCPauseMillis=50设置最大垃圾收集停顿时间为50毫秒。G1垃圾收集器会尽量控制垃圾收集停顿时间,这个参数可以用来指定一个最大值
-XX:+UnlockExperimentalVMOptions启用实验性的虚拟机选项。这个选项用于解锁实验性的JVM参数,但这些参数可能在未来的版本中发生变化或移除
-XX:+UseCGroupMemoryLimitForHeap使用控制组(cgroup)内存限制作为堆的最大大小。这个选项用于容器化环境中,让JVM可以识别并遵守容器的内存限制
-XX:+HeapDumpOnOutOfMemoryError在发生OOM时生成堆转储文件。这个参数用于配置JVM在发生内存溢出时生成堆转储文件,以便进行内存分析
-XX:HeapDumpPath这个参数用于指定生成的堆转储文件的保存路径

因笔者的服务部署在 K8S 环境中,为了更好的获取到自动生成的堆栈文件,需要将容器内保存堆栈信息的路径挂载到宿主机上,以下是 K8S deployment.yaml 相关示例:

apiVersion: apps/v1
kind: Deployment
metadata:...
spec:template:spec:imagePullSecrets:- name: harborvolumes:- name: dumphostPath:path: /var/log/jvmtype: DirectoryOrCreatecontainers:- name: {{ .Chart.Name }}image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"imagePullPolicy: {{ .Values.image.pullPolicy }}volumeMounts:- name: dumpmountPath: /var/log/jvm...

2.2 手动保存

保存当前的 堆信息 到 heapdump.hprof 文件中(保存在当前路径下):

// format=b:dump文件只支持二进制格式
jmap -dump:format=b,file=heapdump.hprof PID

三、JVM 堆栈信息分析工具

推荐使用 MAT:Eclipse's Memory Analysis Tool 进行 JVM 堆栈信息分析。由于最新版本 1.14.0 所需的最低 Java 版本是 Java 11,所以我们下载 支持 Java 8 的旧版本:

Memory Analyzer 1.8.0 Release

1. 左上角 File --> Open Heap Dump --> Leak  Suspects Report(泄漏可疑报告)

2. Problem Suspect --> See stacktrace,可看到堆溢出时候的堆栈日志:

即可定位到出现问题的代码行! 

3. OOM 示例代码

package com.sensetime.idea.aurora.task;import java.util.ArrayList;
import java.util.List;/*** <p>desc</p>** @author Hyatt* @date 2024/3/13*/
public class MainTest {public static void main(String[] args) {try {List<Integer> list = new ArrayList<>();while (true) {list.add(123124123);}} catch (Exception e) {e.printStackTrace();}}}

输出:

java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to D:\tmp\heapdump.hprof ...
Heap dump file created [9754557 bytes in 0.074 secs]
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceededat java.lang.Integer.valueOf(Integer.java:832)at com.sensetime.idea.aurora.task.MainTest.main(MainTest.java:18)

run MainTest#main 方法时,指定 vm options:

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

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

相关文章

前端开发小技巧【Vue篇】 - 样式穿透 + 绑定变量

前言 样式穿透 Vue都是通过深度选择器来样式穿透的。当我们在写项目的时候&#xff0c;经常会导入第三方库&#xff0c;有些特殊的情况&#xff0c;就是在导入第三方库后&#xff0c;呈现的样式并不是我们想要的样式&#xff0c;所以我们需要对第三方的样式进行修改&#xff1…

Java毕业设计 基于SSM jsp房屋租赁系统 房屋出租系统

Java毕业设计 基于SSM jsp房屋租赁系统 房屋出租系统 SSM jsp 房屋租赁系统 房屋出租系统 功能介绍 用户&#xff1a;首页 图片轮播 搜索 登录注册 新闻公告 新闻公告详情 装修广告 热门房源 房源详情 合租 整租 商业办公 普通民宅 酒店式公寓 全部房源 留言交流 发布帖子 模…

Linux下platform设备信息代码框架实现

一. 简介 前面一篇文章简单学习了Linux内核中 platform设备代码。文章地址如下&#xff1a; Linux内核中platform设备简介-CSDN博客 本文来学习如何编写 platform设备代码框架&#xff0c;为了后面学习 Linux下platform驱动开发。 二. Linux下platform设备信息代码框架实现…

汽车大灯罩汽车尾灯罩破裂裂纹破损破洞掉角崩角等问题能修复吗?怎么修复?

汽车大灯汽车尾灯破裂裂纹破损破洞掉角崩角等问题是一定可以修复的。 汽车灯罩的修复方法取决于灯罩的破损程度和材质。以下是一些常见的汽车灯罩修复方法&#xff1a; 肥皂水清洗&#xff1a;如果灯罩只是轻微模糊或发黄&#xff0c;可以使用肥皂水进行清洗。将肥皂水涂抹在…

opencv-python连通域分割connectedComponents

文章目录 连通域简介绘图代码函数说明 连通域简介 所谓连通域&#xff0c;即Connected Component&#xff0c;是一组彼此相连的像素点的集合&#xff0c;这些像素点彼此之间可以假设一条互相链接的路径&#xff0c;路径上所有像素的灰度一致&#xff0c;或者符合某个特定的条件…

今天就简单的说一下前端的游戏逻辑 if else,之前的抖音接入小游戏先缓存,最近太忙,先写一些简单的

比如在 cocos creator 组件 label private label:cc.Label null 然后你有一个逻辑是.如果赋值(就是服务器下发的数据给你,你就显示)如果不下发你前端就判断为空,那么按照以前的逻辑你肯定会这样子写: //假设服务器下发的数据就是 let serverNum 666; //通常的写法是下面这…

【软考高项】四、信息化发展之数字中国

1、数字经济 定义&#xff1a;从本质上看&#xff0c;数字经济是一种新的技术经济范式&#xff0c;它建立在信息与通信技术的重大突破的基础上&#xff0c;以数字技术与实体经济融合驱动的产业梯次转型和经济创新发展的主引擎&#xff0c;在基础设施、生产要素、产业结构和治理…

selenium自动化测试读取csv数据

1.定义读取数据&#xff1a; configFile py文件&#xff1a; class Config: #从read.csv文件中读取个人客户号 def GETKHH_GR(self):fileopen(D:\Pythonproject\read.csv,encodingUTF-8)khhReadercsv.reader(file)# print(list(khhReader))return .join(random.choice(list(…

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…

安装VMWare

下载VMware软件&#xff08;已提供给大家&#xff09; 2&#xff0e;解压压缩文件 3.解压后文件夹中的内容 4.双击.exe进行VMware安装出现的第一个界面 5.点击下一步&#xff0c;出现以下界面 6.勾选我接受复选框&#xff0c;然后点击“下一步”。 7.后面几步都是点击“下一步”…

精品基于Uniapp+ssm英语学习交流平台小程序打卡计划备忘录

《[含文档PPT源码等]精品微信小程序基于Uniappssm英语学习交流平台小程序》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;ssm 安卓框…

深度学习:推动可持续发展与社会责任的创新引擎!

随着科技的飞速发展和全球化的推进&#xff0c;可持续发展和社会责任逐渐成为各个领域关注的焦点。深度学习作为人工智能的重要分支&#xff0c;在可持续发展和社会责任方面发挥着越来越重要的作用。本文旨在探讨深度学习在环境保护、资源利用、犯罪预防和残障人士辅助等领域的…

第 5 章 ROS常用组件-rosbag(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 5.2.1 rosbag使用_命令行 需求: ROS 内置的乌龟案例并操作&#xff0c;操作过程中使用 rosbag 录制&#xf…

从零开始学习深度学习库-2:反向传播

欢迎来到本系列的第二篇文章&#xff0c;我们将从头开始构建一个深度学习库。 本博客系列的代码可以在这个Github仓库中找到。 上一篇文章 在上一篇文章中&#xff08;链接见这里&#xff09;&#xff0c;我们实现了线性层和常见的激活函数&#xff0c;并成功构建了神经网络的…

前端学习笔记 | WebAPIs(DOM+BOM)

一、作用和分类 1、基本概念 作用&#xff1a;使用JS去操作HTML和浏览器 分类&#xff1a;DOM&#xff08;文档对象模型&#xff09;和BOM&#xff08;浏览器对象模型&#xff09; html的标签JS的DOM对象 2、获取DOM对象-参数必须加引号 &#xff08;1&#xff09;选择匹配的第…

LeetCode题练习与总结:在排序数组中查找元素的第一个和最后一个位置

一、题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 二、解…

第10集《天台教观纲宗》

请大家打开讲义第十七页。我们讲到己二、结申正义。 己二、结申正义 《法华经》把我们修行人修行的相貌&#xff0c;比喻作一个车乘。车乘就是一种交通工具&#xff0c;它能够让我们从此岸超越到彼岸去。所以修行它是可以超越的&#xff0c;你今天比昨天超越了&#xff0c;就好…

【C语言步行梯】C语言实现三子棋游戏(含详细分析)

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 需求分析具体实现主函数体菜单实现游戏实…

速盾:怎么看cdn有没有加速生效?

CDN&#xff08;内容分发网络&#xff09;是一种通过在全球范围内部署服务器节点来提供高速访问内容的技术&#xff0c;可以加速网站的加载速度并提高用户体验。当我们使用CDN服务后&#xff0c;如何判断CDN是否生效成为了一个重要的问题。 要判断CDN是否生效&#xff0c;我们…

基于微信小程序的车位共享平台的设计与实现【附项目源码】分享

基于微信小程序的车位共享平台的设计与实现: 源码地址&#xff1a;https://download.csdn.net/download/qq_41810183/88842865 基于微信小程序的车位共享平台设计与实现需求文档 一、引言 随着城市化进程的加快&#xff0c;停车难问题日益凸显。为解决这一难题&#xff0c;我…