当前位置: 首页 > article >正文

JVM出现OOM错误排查

前言

对应线程出现的OOM错误,其实分好几类:堆内存溢出、栈溢出、方法区溢出,下面我们要区分两个概念
内存泄漏: 内存泄漏是指GC垃圾回收的速度跟不上内存消耗的速度,造成OOM的情况
内存溢出: 内存溢出是指程序员在申请内存时,没有足够的内存空间供其用,OutOfMemoryError

参数设置

在生产环境中,我们需要在应用启动时添加几个参数
-XX:+HeapDumpOnOutOfMemoryError:设置JVM发送OOM时生成DUMP文件
-XX:HeapDumpPath=/heapdump.hprof:设置生成的Dump文件位置与文件名
-XX:+PrintGCDateStamps: 设置打印GC时的时间,也可以使用"-XX:+PrintGCTimeStamps"
-Xloggc:log/gc-oomHeap.log: 指定生产GC 日志的位置
-XX:+PrintGCDetails: 打印详情GC日志

分析heapdump.hprof文件

我们在上面设置了对应参数后,当程序发生OOM错误的时候,就把日志打我们指定的文件里,当然你也可以自己手动导出堆文件,但是没有那么方便,手动导出命令:

jmap -dump:format=b,file=<filename.hprof> <pid>
#或者
jmap -dump:live,format=b,file=<filename.hprof> <pid>

使用JDK自带jvisualvm.exe分析生成的dump文件

1.在JDK的bin目录下找到jvisualvm.exe 运行,点击文件–>装入需要分析的dump文件"heapdump.hprof"
导入hprof文件
2.分析后查看导致OOM异常方法
查看详情
3.点击进入异常方法,可以看到实际是哪一行代码发生的异常
定位错误
4.点击类可以查看那个对象过多发生的异常
类信息

使用Eclipse Memory Analyzer 分析生成的dump文件

解决

  • 检查是否有大对象分配,大数组分配
  • 通过jmap命令,把堆内存dump下来,使用MAT等工具分析是否存在内存泄漏
  • 如果不存在泄漏加大堆内存"-Xmx"
  • 检查是否有Finalizable对象,大量的不可达未回收垃圾对象

http://www.kler.cn/a/380382.html

相关文章:

  • C语言教程——操作符详解(2)
  • 【折腾一上午】Java POI 导出 Excel 自适应列宽行高
  • GO语言基础(三)
  • 【华为HCIP实战课程31(完整版)】中间到中间系统协议IS-IS路由汇总详解,网络工程师
  • 架构系列---高并发
  • 软件架构演变:从单体架构到LLM链式调用
  • 类被加载到jvm后再被注册到Spring中
  • Java 教程简介
  • JqGird 动态生成列使用
  • django各个文件简单介绍
  • RabbitMQ交换机类型
  • C#代码生成器实现原理
  • w~大模型~合集19
  • 【JAVA】Java基础—Java开发环境搭建:安装JDK与IDE(如IntelliJ IDEA、Eclipse)
  • 临街矩阵乘以自己转置的含义
  • 气象大模型学习笔记
  • QT:QThread:重写run函数
  • HarmonyOS:UIAbility组件概述
  • k8s 上如何跑 Dolphins 模型
  • CentOS一次性安装 Nginx 的脚本指南
  • MySQL45讲 第十一讲 怎么给字符串字段加索引?
  • TCP建立连接之后怎么保持长连接(检测连接断没断)
  • 面试准备第一版ssm spring-springmvc
  • Swift 开发教程系列 - 第1章:Swift 简介与开发环境配置
  • Ubuntu下网络抓包工具:Wireshark与Tcpdump实例解析
  • 科技 | 谷歌 AI 生成代码争议