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错误的时候,就把日志打我们指定的文件里,当然你也可以自己手动导出堆文件,但是没有那么方便,手动导出命令:

sh 复制代码
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"

2.分析后查看导致OOM异常方法

3.点击进入异常方法,可以看到实际是哪一行代码发生的异常

4.点击类可以查看那个对象过多发生的异常

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

解决

  • 检查是否有大对象分配,大数组分配
  • 通过jmap命令,把堆内存dump下来,使用MAT等工具分析是否存在内存泄漏
  • 如果不存在泄漏加大堆内存"-Xmx"
  • 检查是否有Finalizable对象,大量的不可达未回收垃圾对象
相关推荐
云空14 分钟前
《DeepSeek 网页/API 性能异常(DeepSeek Web/API Degraded Performance):网络安全日志》
运维·人工智能·web安全·网络安全·开源·网络攻击模型·安全威胁分析
深度Linux18 分钟前
Linux网络编程中的零拷贝:提升性能的秘密武器
linux·linux内核·零拷贝技术
没有名字的小羊1 小时前
Cyber Security 101-Build Your Cyber Security Career-Security Principles(安全原则)
运维·网络·安全
千夜啊1 小时前
Nginx 运维开发高频面试题详解
运维·nginx·运维开发
存储服务专家StorageExpert2 小时前
答疑解惑:如何监控EMC unity存储系统磁盘重构rebuild进度
运维·unity·存储维护·emc存储
chian-ocean4 小时前
从理论到实践:Linux 进程替换与 exec 系列函数
linux·运维·服务器
拎得清n4 小时前
UDP编程
linux
敖行客 Allthinker4 小时前
从 UTC 日期时间字符串获取 Unix 时间戳:C 和 C++ 中的挑战与解决方案
linux·运维·服务器·c++
JunLan~5 小时前
Docker 部署 GLPI(IT 资产管理软件系统)
运维·docker·容器
夏尔Gaesar6 小时前
Vim安装与配置教程(解决软件包Vim没有安装可候选)
linux·编辑器·vim