JVM出现OOM错误排查

打印 上一主题 下一主题

主题 860|帖子 860|积分 2580

前言

对应线程出现的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错误的时候,就把日志打我们指定的文件里,当然你也可以自己手动导出堆文件,但是没有那么方便,手动导出命令:
  1. jmap -dump:format=b,file=<filename.hprof> <pid>
  2. #或者
  3. 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对象,大量的不可达未接纳垃圾对象

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表