网站首页 > java教程 正文
内存溢出怎么排查?
hello,今天来给大家分享一下内存溢出该怎么去排查。我这边用的分析工具是eclipse memory and roll,我这边有一个demo,就是很简单,就是往这样的一个数组里面不断的添加by数组,大概是一兆。
然后我这边先要添加上这样的一段参数,这个意思是说初始化和最大的堆内存是二十兆。然后这边有一个hip dump on out of memory error,意思就是说在内存溢出的时候会生成一个dump文件,然后存储在目录下,然后我就把它添加到这边,应用一下,运行一下。运行之后就会在这样的一个目录下面生成了这样的一个档谱文件。
现在用这个工具去给它打开,打开之后点完成,这边有个overview。分析内存溢出的步骤大概有三步,我总结了一下。
·第一步,去看占有内存过大的一个对象有哪些。
·第二步,就看这个对象是被谁引用的。
·第三步,可以再定位到具体的一个代码。
→首先去看一下占有内存过大的一个对象有哪些。可以去看Histogram这样的直方图,去点击这个标志就看它的一个直方图,这边显示的是内存占用的一个大小,可以看到byte数组占用的是比较大的。然后这边有一个浅堆和一个深堆,浅堆跟深堆类似于浅拷贝和深拷贝的关系。
→然后第二步,看一下它是被谁引用的。可以去看dominator tree就是支配树,然后可以点这样的一个符号,它这边可以看到支配树的一些信息,其实就是引用关系图。比如说main线程占用的一个深堆是比较大的,可以点进去看一下。
然后可以看到这个里面有个released,它占用的一个内存是最大的,然后点进去看一下,这里面就有一个数组,然后占用了很多的一个byte数组,其实就找到了它是被谁引用的了,是被main线程里的release给引用的。
→第三步,可以定位到具体的代码。定位到具体代码可以点击thread overview,比如说点击齿轮的这种形式,点进去,然后这边就可以看到线程的概览信息。同理main线程占有的一个深堆是比较大的,就可以点进去看一下。
然后它这个里面其实就已经有一个cout,out of memory error异常了。
这个里面就有一个arraylist的集合,里面有一个element data的数组,引用了很多的对象。可以看这样的代码就是oomtest,java的23行其实就已经定位到了oom内存溢出的行数了。23行其实就是这一行,不断的去添加一兆的数组往集合里面。
其实demo是比较简单难的,我觉得是如果代码是你自己写的,可能很快就改完了。但是如果是一些中间件的代码造成的内存溢出,就要求对中间件的实现有个基本的了解才能解决。
猜你喜欢
- 2024-11-02 Java堆内存又溢出了!看大师如何防范
- 2024-11-02 并发编程中常见的内存溢出的三种情况
- 2024-11-02 jmeter内存溢出解决方法(jmeter怎么清理缓存)
- 2024-11-02 JAVA服务实例内存高问题排查及解决!牛掰
- 2024-11-02 面试官:你知道JVM内存溢出问题的定位方法吗?
- 2024-11-02 简述 JVM 基础(二):Java内存区域与内存溢出异常
- 2024-11-02 一次大量出现Full GC、内存泄漏问题及内存溢出错误排查和分析
- 2024-11-02 如何识别Java中的内存泄漏(如何识别java中的内存泄漏情况)
- 2024-11-02 java 面试专题一:(Java基础)第三篇常见内存溢出异常问题
- 2024-11-02 JAVA 8 内存溢出总结(java内存溢出会导致应用停机吗)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)