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

news2025/1/18 10:44:10

一、前言

在日常开发中,即使代码写得再谨慎,免不了还是会发生各种意外的事件,比如服务器内存突然飙高,又或者发生内存溢出(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: harbor
      volumes:
        - name: dump
          hostPath:
            path: /var/log/jvm
            type: DirectoryOrCreate
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          volumeMounts:
            - name: dump
              mountPath: /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 exceeded
	at 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.coloradmin.cn/o/1515400.html

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

相关文章

OneDrive教育版迁移记录

背景 微软再次削减教育版优惠的OneDrive容量&#xff0c;从原先的5T直接砍到100G/人&#xff0c;同时对每个学校保留总共100TB的共享存储容量。 右键Onedrive图标——设置——存储容量可见 100GB对于重度用户显然是不够使用的&#xff0c;为此笔者改换Microsoft Office365家庭…

javascript如何实现继承

文章目录 一、是什么二、实现方式原型链继承构造函数继承组合继承原型式继承寄生式继承寄生组合式继承 三、总结相关链接 一、是什么 继承&#xff08;inheritance&#xff09;是面向对象软件技术当中的一个概念。 如果一个类别B“继承自”另一个类别A&#xff0c;就把这个B称…

基于SpringBoot+MYSQL+Vue的校园管理系统

目录 1、前言介绍 2、主要技术 3、系统流程分析 3.1、操作流程 3.2、添加信息流程 3.3、删除信息流程 4、系统设计 4.1 系统体系结构 4.2开发流程设计 4.3 数据库设计原则 4.4 数据表 5、运行截图(部分) 5.1管理员功能模块 5.2用户功能模块 5.3院校管理员功能模块…

【django framework】ModelSerializer+GenericAPIView,如何在提交前修改某些字段值

【django framework】ModelSerializerGenericAPIView&#xff0c;如何在提交前修改某些字段值 我们经常会遇到下面这种情况&#xff1a; 序列化器用的是ModelSerializer&#xff0c;写视图的时候继承的是generics.CreateAPIView。现在我想在正式提交到数据库(perform_create)之…

使用Java自带的VisualVM监控远程服务器部署在Docker容器中的Java项目并使用Mat在线工具排查服务器内存泄露或内存溢出的原因

事情是这样的&#xff0c;我们项目最近应业主的要求迁移到了新的服务器&#xff0c;起初一切正常&#xff0c;部署、上线、测试都没有问题&#xff0c;项目大概运行了一周的工作日时间都没出现问题&#xff0c;直到周六那天&#xff0c;项目经理打电话过来说服务器崩了&#xf…

websocket逆向案例

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、案例地址二、分析流程三、逆向参数四、webSocket 交互位置总结 前言 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供…

第六篇【传奇开心果系列】Python的自动化办公库技术点案例示例:大学生数据全方位分析挖掘经典案例

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas库全方位分析挖掘大学生数据能力介绍二、大学生学生成绩数据分析数据挖掘示例代码三、大学生选课数据分析数据挖掘示例代码四、大学生活动参与数据分析数据挖掘示例代码五、大学…

VsCode免密登录

创建本地密匙 按下WinR输入cmd&#xff0c;输入 ssh-keygen -t rsa然后连续回车直到结束 找到Your public key has been saved in C:\Users\Administrator/.ssh/id_rsa.pub&#xff0c;每个人都不一样找到密匙所在地 打开id_rsa.pub这个文件&#xff0c;可以用记事本打开&am…

Parade Series - WebRTC ( < 300 ms Low Latency ) T.B.D

Parade Series - FFMPEG (Stable X64) 延时测试秒表计时器 ini/config.ini [system] homeserver storestore\nvr.db versionV20240312001 verbosefalse[monitor] listrtsp00,rtsp01,rtsp02 timeout30000[rtsp00] schemartsp ip127.0.0.1 port8554 usr pwd context/cam08001…

锐科达高速公路智慧隧道应急通讯网络广播解决方案

锐科达高速公路智慧隧道应急通讯网络广播解决方案 我国已是世界上公路隧道里程最长、规模最大、发展最快的国家。面对数量庞大的公路隧道&#xff0c;如何严防在隧道内发生重特大交通安全事故以及保障发生紧急情况下的应急通讯&#xff0c;是各地交通运输主管部门、各级指挥中心…

在ubuntu20通过docker部署zabbix6

部署Zabbix 6.x服务器在Ubuntu 20.04 LTS系统上使用Docker的方式可以简化安装过程并实现容器化管理。以下是一个简化的步骤指南&#xff1a; 步骤1&#xff1a;安装Docker和Docker Compose 确保你的Ubuntu系统已经安装了Docker和Docker Compose。如果没有&#xff0c;请执行以…

创建SpringCloudGateWay

创建SpringCloudGateWay 本案例基于尚硅谷《谷粒商城》项目&#xff0c;视频27 创建测试API网关 1、创建module 2、引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:x…

使用Nginx进行负载均衡

什么是负载均衡 Nginx是一个高性能的开源反向代理服务器&#xff0c;也可以用作负载均衡器。通过Nginx的负载均衡功能&#xff0c;可以将流量分发到多台后端服务器上&#xff0c;实现负载均衡&#xff0c;提高系统的性能、可用性和稳定性。 如下图所示&#xff1a; Nginx负…

snowny-小诺框架-标签tabs消失不见

可能是由于&#xff0c;在配置菜单时&#xff0c;排序数字过小造成的&#xff0c;将排序数字改成大于0的数字就好使了。

ChatGPT浪潮来袭!谁先掌握,谁将领先!

任正非在接受采访时说 今后职场上只有两种人&#xff0c; 一种是熟练使用AI的人&#xff0c; 另一种是创造AI工具的人。 虽然这个现实听起来有些夸张的残酷&#xff0c; 但这就是我们必须面对的事实 &#x1f4c6; 对于我们普通人来说&#xff0c;我们需要努力成为能够掌握…

ip广播智慧工地广播喊话号角 IP网络号角在塔吊中应用 通过寻呼话筒预案广播

ip广播智慧工地广播喊话号角 IP网络号角在塔吊中应用 通过寻呼话筒预案广播 SV-704XT是深圳锐科达电子有限公司的一款壁挂式网络有源号角&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和号角喇叭输出播放&#xff0c;可达到功率50W。SV-704XT内置有…

【绩效管理】某连锁购物中心绩效考核体系搭建咨询项目

随着企业规模的扩大&#xff0c;员工数量不断增加&#xff0c;与之相关的人事管理工作的复杂性也随之增大。但是由于行业的特点&#xff0c;该购物中心的人员整体素质偏低&#xff0c;且自成立以来&#xff0c;该中心重经营轻管理&#xff0c;其人力资源管理水平也有待提升。在…

基于SpringMVC+JSP实现的亚盛汽车配件销售业绩管理统

采用技术 基于SpringSpringMVCMyBatis框架实现亚盛汽车配件销售业绩管理统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 员工端效果 进货信息 配件管理…

群晖 Synology Photos DSM7 自定义文件夹管理照片

背景 众所周知&#xff0c;目前群晖DSM7中使用Synology Photos做照片管理时&#xff0c;个人照片只能默认索引 /home/Photos 文件夹&#xff0c;但是如果个人照片很多或者用户很多时&#xff0c;共享文件夹/homes 所在的存储空间就会不够用 当然&#xff0c;如果你的存…

2024考研计算机考研复试-每日重点(第十九期)

公众号“准研计算机复试”&#xff0c;超全大佬复试资料&#xff0c;保姆级复试&#xff0c;80%的题目都是上岸大佬提供的。 研宝们&#xff0c;App更新啦&#xff01; 操作系统&#xff1a; 10.★什么是中断&#xff1f; 中断是指计算机运行过程中&#xff0c;出现某些意外时…