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

dump文件分析OOM及线程堆栈

OutOfMemoryError (OOM)

如果项目报错: OutOfMemoryError: Java heap space,说明堆内存空间(Heap Space)中没有足够的空间来分配对象了。
一旦发生 OOM,系统有可能不可用,或者频繁重启。属于非常严重的问题。

OOM 的解决方法一:

比较简单粗暴的一种做法,是增大堆内存空间。
在 项目启动时,调大 -Xms 和 -Xmx 。
-Xms 参数用于设置JVM的初始堆内存大小,而-Xmx参数用于设置JVM的最大堆内存大小。

-Xms1024m  -Xmx2048m

OOM 的解决方法二:

-Xms 和 -Xmx 哪怕调大了,如果没有找到根本的原因,大对象不断创建,不断地占用堆内存空间,还是有可能会继续 OOM。

可以设置在发生 OOM 时自动 dump 文件,保存到指定的文件。
dump文件是进程的内存镜像,可以通过分析 dump 文件,找到导致 OOM 的代码。

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof

oom 代码示例:

不断循环,不断创建对象,占用堆内存空间,模拟 OOM 的场景。

public class OomTest {public static void main(String[] args)  {createObject();}/*** 不断循环,不断创建对象,模拟 OOM 的场景**/public static void createObject()  {List<OomObject> oomList =new ArrayList<>();while (true) {OomObject oomObject = new OomObject();oomList.add(oomObject);}}}

添加 jvm 相关启动参数( Vm option ) :

  • 点击 Edit Configurations:
    在这里插入图片描述

  • 点击 Modify options, 选择 Add Vm Options :

在这里插入图片描述

启动参数( Vm option ) 如下:

添加启动参数,设置最大内存为 8m,模拟 OOM 的场景。

HeapDumpOnOutOfMemoryError 表示在发生 OOM 时会自动 dump 。

-Xms4m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/heapdump.hprof

运行代码:

结果如下:

Connected to the target VM, address: '127.0.0.1:63909', transport: 'socket'
java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:/heapdump.hprof ...
Heap dump file created [31923817 bytes in 0.263 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:3210)at java.util.Arrays.copyOf(Arrays.java:3181)at java.util.ArrayList.grow(ArrayList.java:261)at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)at java.util.ArrayList.add(ArrayList.java:458)at com.example.demo.oom.OomTest.createObject(OomTest.java:21)at com.example.demo.oom.OomTest.main(OomTest.java:14)

可以看到 :

java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:/heapdump.hprof …

这里的 D:/heapdump.hprof ,就是 dump 文件保存的路径。

打开 dump 文件

点击 Profiler ,再点击 Open Snapshot ,选择 上面的 dump 文件 D:/heapdump.hprof 。

在这里插入图片描述

点击 Biggest Objects, 可以看到 OomObject 这个对象占用了最大的内存。

结果如下:

在这里插入图片描述

使用 jdk 自带的 java visualvm ,分析dump文件, 找到 导致OOM 的代码

另外,也可以下载 MAT(Memory Analyzer Tool) 来分析 dump 文件。
此处使用 jdk 自带的 java visualvm 来分析 dump 文件, 找到 导致OOM 的代码 。

在 jdk 的 bin 文件中,找到 jvisualvm.exe 。点击即可运行。

在这里插入图片描述

  • 装入 hprof 后缀的 dump 文件 :

打开 VisualVM 后,点击左上角的图标 ,装入, 文件名选择 之前的 dump 文件 D:/heapdump.hprof 。

文件类型 选择 【堆Dump(*.hprof)】。

在这里插入图片描述

可以看到,在出现 OutOfMemoryError 异常错误时进行了堆转储,导致 OutOfMemoryError 异常错误的线程 是哪一个。

点击这个线程,即可显示导致OOM的线程堆栈。

在这里插入图片描述

  • 可以看到导致OOM的具体代码是类的哪一行:

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【LaTeX】7实现章节跳转
  • 职场口才提升之道
  • Sentry(Android)源码解析
  • 184. 部门工资最高的员工
  • el-select动态禁用
  • python+requests接口自动化测试框架实例详解
  • 关闭Elasticsearch built-in security features are not enabled
  • PHP+MySQL开发组合:智慧同城便民信息小程序源码系统 带完整的安装代码包以及安装部署教程
  • 高阶SQL语句(二)
  • 为什么不能用短链接
  • 爱与愁的心痛
  • 初识kafka-数据存储篇1
  • 搜维尔科技:【应急演练】【工业仿真】救援模拟演练可视化仿真项目实施
  • 网关层针对各微服务动态修改Ribbon路由策略
  • 嵌入式Linux:空洞文件
  • Google 是如何开发 Web 框架的
  • 【mysql】环境安装、服务启动、密码设置
  • 【React系列】如何构建React应用程序
  • 08.Android之View事件问题
  • co.js - 让异步代码同步化
  • Elasticsearch 参考指南(升级前重新索引)
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • IndexedDB
  • JavaScript对象详解
  • JS字符串转数字方法总结
  • php的插入排序,通过双层for循环
  • Redis学习笔记 - pipline(流水线、管道)
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 和 || 运算
  • 基于HAProxy的高性能缓存服务器nuster
  • 让你的分享飞起来——极光推出社会化分享组件
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 项目实战-Api的解决方案
  • 小程序开发中的那些坑
  • 移动端 h5开发相关内容总结(三)
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​插件化DPI在商用WIFI中的价值
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #{}和${}的区别是什么 -- java面试
  • #微信小程序(布局、渲染层基础知识)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (论文阅读40-45)图像描述1
  • (十一)c52学习之旅-动态数码管
  • (算法二)滑动窗口
  • (一) storm的集群安装与配置
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (自用)仿写程序
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .“空心村”成因分析及解决对策122344
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET Core IdentityServer4实战-开篇介绍与规划