文档章节

Eclipse Memory Analyzer(Java内存泄漏分析工具)

FEINIK
 FEINIK
发布于 2017/04/06 14:04
字数 1424
阅读 571
收藏 4

概述

一个大型的Java项目也许从开发到测试结束并未发现一些大的问题,但是在生产环境中还是会出现一些非常棘手的问题,如内存泄漏,遇到这样的问题对于一个经验尚浅的开发人员来说难度非常大,好的一点是JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。

接下来介绍的一个工具是 Eclipse Memory Analyzer 它被认为是一个“傻瓜式“的堆转储文件分析工具,通过该工具可以生成一个专业的分析报告,从而帮我们准确的定位到问题的所在位置。

安装 Eclipse Memory Analyzer

这里介绍三种安装方式

方式一:直接从官网下载程序包 http://www.eclipse.org/mat/downloads.php,解压可直接使用。

方式二:在Eclipse中通过 Help -> Install New Software,输入地址 http://download.eclipse.org/mat/1.6.1/update-site/ 进行安装

方式三(推荐):Eclipse 的可插拔式插件安装方式,这里不在介绍具体的插件安装步骤,安装后重启Eclipse,这样就可以在Eclipse中直接打开Heap Dump文件了。

配置环境参数

安装完成之后,为了更有效率的使用 Eclipse Memory Analyzer ,我们还需要做一些配置工作。因为通常而言,分析一个堆转储文件需要消耗很多的堆空间,为了保证分析的效率和性能,在有条件的情况下,我们会建议分配给 Eclipse Memory Analyzer 尽可能多的内存资源。你可以采用如下两种方式来分配内存更多的内存资源给 Eclipse Memory Analyzer 。

方式一:修改启动参数 MemoryAnalyzer.exe -vmargs -Xmx4g

方式二:编辑文件 MemoryAnalyzer.ini,在里面添加类似信息 -vmargs – Xmx4g。

如何获得堆转储文件

方式一:在Eclipse中配置JVM启动参数 -XX:+HeapDumpOnOutOfMemoryError

方式二:通过JDK自带的工具JMap,JConsole来获得一个堆转储文件

这里我们使用方式一来获得

结合案例分析

1. 编写一个内存溢出的例子然后获得堆转储文件

import java.util.ArrayList;
import java.util.List;
public class HeapOOM {
    static class OOMObject{}
    public static void main(String[] args) {
        List<OOMObject> ooms = new ArrayList<OOMObject>();
        while (true) {
            ooms.add(new OOMObject());
        }
    }
}

2. VM参数配置如下

3. 运行示例代码即可生成如下文件然后双击打开

分析报告

内存占用整体概览

直接点击饼图下方的 Reports->Leak Suspects 链接来生成报告。

查看报告一(内存消耗的整体状况)

从图上我们可以清晰地看到一个可疑对象消耗了系统近 98% 的内存。再往下看饼图下方文字简短描述了大量的内存是由属于Object实例的对象所消耗的,system class loader 负责加载这个对象。也许从这里还不能找出内存泄漏的具体原因,接着往下看。

查看报告二(分析问题的所在)

首先我们简单回顾下 JAVA 的内存回收机制,内存空间中垃圾回收的工作由垃圾回收器 (Garbage Collector,GC) 完成的,它的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。

在垃圾回收机制中有一组元素被称为根元素集合,它们是一组被虚拟机直接引用的对象,比如,正在运行的线程对象,系统调用栈里面的对象以及被 system class loader 所加载的那些对象。堆空间中的每个对象都是由一个根元素为起点被层层调用的。因此,一个对象还被某一个存活的根元素所引用,就会被认为是存活对象,不能被回收,进行内存释放。因此,我们可以通过分析一个对象到根元素的引用路径来分析为什么该对象不能被顺利回收。如果说一个对象已经不被任何程序逻辑所需要但是还存在被根元素引用的情况,我们可以说这里存在内存泄露。

点击“Details ”链接

查看从根元素到内存消耗聚集点的最短路径

我们可以很清楚的看到整个引用链,内存聚集点是在 Java main 线程创建的一个集合元素上。接下来,我们再继续看看,这个对象集合里到底存放了什么,为什么会消耗掉如此多的内存。

注:

Shallow Heap 为对象自身占用的内存大小,不包括它引用的对象。

Retained Heap 为当前对象大小 + 当前对象可直接或间接引用到的对象的大小总和,如:

A对象的 Retained Heap = A对象的 Shallow Heap + C对象的 Shallow Heap 这里不包含 D 对象的 Shallow Heap因为 D对象被Root根对象所引用。

B对象的 Retained Heap = B对象的 Shallow Heap。

查看内存消耗聚集对象信息

 

在这张图上,我们可以清楚的看到,这个对象集合中保存了大量 OOMObject 对象的引用,就是它导致的内存泄露。

至此,我们已经拥有了足够的信息去寻找泄露点。

© 著作权归作者所有

共有 人打赏支持
FEINIK
粉丝 221
博文 57
码字总数 53142
作品 0
广州
后端工程师
Eclipse中安装MemoryAnalyzer插件及使用

Eclipse中安装MemoryAnalyzer插件 一、简介   Eclipse作为JAVA非常好用的一款IDE,其自带的可扩展插件非常有利于JAVA程序员的工作效率提升。   MemoryAnalyzerTool(也叫MAT)是一款JAVA虚...

gdy
2017/08/02
0
0
利用Eclipse对MAT进行分析解决JAVA内存问题

我们在开发过程中往往会遇到 java.lang.OutOfMemoryError: Java heap space或者stackoverflow 这样或那样内存不够的错误。这种错误在开发人员对jvm里面的一些机制不清楚的情况下经常是摸不着...

古月楼
2013/10/18
0
0
IBM和SAP开源其JVM诊断工具

IBM最近发布了其Java诊断工具套件,该套件包含如下工具:面向Java的产品转储分析器(Dump Analyzer)、处理垃圾收集(GC,即Garbage Collection)的Extensible Verbose Toolkit和Java锁分析器...

JavaGG
2010/03/24
0
0
【android测试】值得学习的android测试知识连接

Android应用程序的debug属性: http://blog.csdn.net/hudashi/article/details/8698142 彻底解决Android 应用方法数不能超过65535的问题 http://blog.csdn.net/yuanzeyao/article/details/418......

beijing_zbs
2014/12/02
0
0
Heapdump javacore文件分析工具

这个一定要记下来,以备不时之需: IBM HeapAnalyzer 更多信息见官方网站地址:http://www.alphaworks.ibm.com/tech/heapanalyzer 在我们的应用程序发生内存泄露的时候,会生成heapdump文件,...

晨曦之光
2012/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ppwjs之bootstrap文字排版:字体大小写设置

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
12分钟前
0
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
27分钟前
0
0
开发5分钟,调试2小时 - 该如何debug?

几年来我在答疑群、论坛、公众号、知乎回答的各种问题,没有一万也有八千。其中有三分之二以上都是在帮人看报错,帮人 debug(调试代码)。 可以说,会不会 debug,有没有 debug 的意识,懂不...

crossin
27分钟前
0
1
SQL count(*) 和count(1)的区别

开发中经常会使用这两个聚合函数,作用都是用来统计记录行,今天查找资料发现,其实这两个函数并没有区别, 实践才是检验的标准,首先看执行计划(表是我自己建立的): 可以看到,两个执行计...

一曲图森破
32分钟前
1
0
区块链100讲:详解区块链之P2P网络

1 P2P网络 如果我们简单来看 P2P 技术,它的应用领域已经非常广泛了,从流媒体到点对点通讯、从文件共享到协同处理,多种领域都有它的身影出现。 同样的,P2P 的网络协议也有很多,比较常见的...

HiBlock
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部