【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: 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.mfbz.cn/a/455625.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

展厅设计中灯光的要点都是什么

1、白炽灯 白炽灯也就是普通普通白炽灯泡白炽灯有显色性强&#xff0c;开灯即亮&#xff0c;明暗可调&#xff0c;结构简单&#xff0c;造价低等优点&#xff0c;但缺点是使用寿命短&#xff0c;光效较低展厅设计中常使用于走道和其他部位。 2、卤钨灯 充气白炽灯填充气体中含有…

代码随想录day20(1)二叉树:二叉树的最小深度(leetcode111)

题目要求&#xff1a;求出一棵二叉树的最小深度 思路&#xff1a;最小深度指的是从根节点到最近叶子节点的最短路径上的节点数量&#xff08;左右孩子必须都为空&#xff01;&#xff09;。思路类似于求二叉树的最大深度&#xff0c;仍然采用后序遍历&#xff0c;增加判断只有…

Docker启动安装nacos(踩过坑版)

1、Docker 拉取镜像 docker pull nacos/nacos-server:v2.1.0 2、创建宿主机挂载目录 mkdir -p /mydata/nacos/logs/ mkdir -p /mydata/nacos/conf/ 3、启动nacos并复制文件到宿主机&#xff0c;关闭容器 启动容器 docker run -p 8848:8848 --name nacos -d nacos/nacos-se…

通过Maven创建Web工程

通过Maven创建Web工程 方式一方式二 方式一 1.先创建一个Maven工程 2.把该Maven模块的pom文件里添加一个war 3.选中该Maven模块 点击项目架构 4.手动添加一个Web架构 方式二 1.也是new一个模块 但是直接配置好Web 2.这里就是我IDEA对Maven的设置 3.第一次创建 可能…

【C++】STL--String

这一节主要总结string类的常见接口&#xff0c;以及完成了string类的模拟实现。 目录 标准库的String类 string类常见接口 string类对象的常见构造 string析构函数&#xff1a;~string string类对象的容量操作 string类对象的访问及遍历操作 string类对象的修改操作 s…

jvm题库详解

1、JVM内存模型 注意&#xff1a;这个是基于jdk1.8之前的虚拟机&#xff0c;在jdk1.8后 已经没有方法区&#xff0c;一并合并到堆中的元空间了 JVM内存区域总共分为两种类型 线程私有区域&#xff1a;程序计数器、本地方法栈和虚拟机栈 线程共享区域&#xff1a;堆&#xff08…

让若依生成的service、mapper继承mybatisPlus的基类

前言&#xff1a;若依继承mybatisPlus后&#xff0c;生成代码都要手动去service、serviceImpl、mapper文件去继承mybatisplus的基类&#xff0c;繁琐死了。这里通过修改若依生成模版从而达到生成文件后直接使用mybatisPlus的方法。 一、首先找到若依生成模版文件位置&#xff…

顶顶通呼叫中心中间件-群集模式配置

文章目录 群集模式介绍联系我们配置流程群集模式下呼叫线路配置 群集模式介绍 在大规模的外呼或者呼入系统&#xff0c;比如整个系统需要1万并发&#xff0c;单机最高也就3000-5000并发&#xff0c;这时候就需要多机群集了。顶顶通呼叫中心中间件使用的是 redis 数据库&#x…

你选的Six Sigma咨询公司靠谱吗?保姆级避坑指南

近年来&#xff0c;企业为了追求更高的运营效率和产品质量&#xff0c;纷纷寻求Six Sigma这样的先进管理方法。然而&#xff0c;市场上的咨询公司琳琅满目&#xff0c;如何选择一家真正靠谱、能带来实际效益的咨询公司呢&#xff1f; 一、了解公司背景和实力 在选择Six Sigma咨…

msdn我告诉你itellyou做一个安静的工具站,各种windows镜像下载,iso体积都是很小的那种

官网地址&#xff1a;MSDN, 我告诉你 - 做一个安静的工具站 可以看到里面集成了各种操作系统&#xff0c;可以下载使用。 或者在他的新站点&#xff1a;登录 里面有最新的windows11系统可以下载&#xff0c;但是需要登陆之后才可以&#xff0c;随便第三方账号登陆即可&…

【Devin AI】全球首位AI程序员登场,程序员该如何保住饭碗?编程新纪元的革命已到来!

程序员们&#xff0c;警惕&#xff01;我们的饭碗要被砸了&#xff01; 一觉醒来&#xff0c;全球首位AI程序员 Devin 上线了&#xff01;直接引爆整个科技圈。 Devin被介绍为世界首个完全自主的AI软件工程师。只需一句指令&#xff0c;它可端到端地构建和部署整个开发项目。 …

Ajax学习笔记(一):原生AJAX、HTTP协议、AJAX案例准备工作、发送AJAX请求、AJAX 请求状态

目录 一、原生AJAX 1.1AJAX 简介 1.2 XML 简介 1.3 AJAX的特点 二、HTTP协议 三、AJAX案例准备工作 四、发送AJAX请求 1.发送GET请求 2.发送POST请求 3.JSON响应 IE缓存问题&#xff1a; 五、AJAX 请求状态 一、原生AJAX 1.1AJAX 简介 AJAX 全称为 Asynchronous …

使用Nginx进行负载均衡

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

shell控制多线程并发处理

一、前言 我们在用shell编程时&#xff0c;当用到循环语句时&#xff0c;如果循环的对象数量比较多&#xff0c;则代码一条一条处理&#xff0c;时间消耗会特别慢。如果此时机器资源充足&#xff0c;不妨学会多线程并发处理这招&#xff0c;帮助你提前打卡完成工作。 二、控制…

MySQL数据库自动备份(Linux操作系统)

方式一 参考&#xff1a;https://blog.csdn.net/qq_48157004/article/details/126683610?spm1001.2014.3001.5506 1.MySQL备份脚本 在/home/backups/下建立.sh文件&#xff0c;文件名称 mysql_backup.sh ,内容如下 #!/bin/bash #备份路径 BACKUP/home/backups/mysqlBackup…

酷开系统走在前列,品牌重启增长,酷开科技成为品牌商合作目标

区别于火热的移动端&#xff0c;手机屏作为私密屏&#xff0c;往往面向的是用户个体&#xff0c;而电视作为家庭连接的重要枢纽&#xff0c;不仅仅定位于公共屏&#xff0c;同时也面向客厅场景发挥着其大屏传播的作用&#xff0c;这里不仅牵扯到大屏营销&#xff0c;也关联着大…

奥赛满分金牌得主出品,硅谷诞生超级AI码农

又是让程序员们兴奋而焦绿&#x1f34c;的一刻&#xff0c;昨天业界又发布了一款 AI 编程产品 Devin。号称是业界第一个 AI 软件工程师。 作者 Scott Wu 曾是国际信息奥赛 (IOI) 连续三届的金牌得主&#xff0c;其中还有一届是满分。 Devin 背后的公司名字叫 Cognition。中文翻…

Matlab有限元结果后处理 | 不规则云图绘制(二维/三维)|【Matlab源码+视频教程】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

SSA-LSTM多输入回归预测 | 樽海鞘优化算法-长短期神经网络 | Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

换掉ES!Redis官方搜索引擎来了,性能炸裂!

RediSearch 一、介绍二、实现特性1. 对比 Elasticsearch2. 索引构建测试3. 查询性能测试 三、安装1. 源码安装2. docker安装3. 判断是否安装成功 四、命令行操作1. 创建1.1 创建索引1.2 创建文档 2. 查询2.1 基本查询2.1.1 全量查询2.1.2 匹配查询 2.2 模糊匹配2.2.1 后置匹配2…
最新文章