专业的JAVA编程教程与资源

网站首页 > java教程 正文

内存溢出排查思路 内存溢出排查通用思路大概就是这三步了#编程

temp10 2024-11-02 13:39:10 java教程 14 ℃ 0 评论

内存溢出怎么排查?

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是比较简单难的,我觉得是如果代码是你自己写的,可能很快就改完了。但是如果是一些中间件的代码造成的内存溢出,就要求对中间件的实现有个基本的了解才能解决。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表