为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Eclipse Memory Analyzer 进行堆转储文件分析

标签:
Java

概述

Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗。本文主要介绍如何安装配置 Memory Analyzer,并结合一个实例,介绍如何利用 MAT 来进行堆转储文件分析,找到内存泄露的根源。

对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现。JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。

通常内存泄露分析被认为是一件很有难度的工作,一般由团队中的资深人士进行。不过,今天我们要介绍的 MAT(Eclipse Memory Analyzer)被认为是一个“傻瓜式“的堆转储文件分析工具,你只需要轻轻点击一下鼠标就可以生成一个专业的分析报告。和其他内存泄露分析工具相比,MAT 的使用非常容易,基本可以实现一键到位,即使是新手也能够很快上手使用。MAT 的使用是如此容易,你是不是也很有兴趣来亲自感受下呢,那么第一步我们先来安装 MAT。

安装MAT

MAT和class文件反编译工具Java Decompiler jd-gui一样。可以作为插件安装到Ecplise中,也可以作为独立的应用运行。

安装插件

  1. 通过HELP --> Software Updates 启动软件更新管理向导。
  2. 添加一个新的Repository。位置(L):http://download.eclipse.org/technology/mat/0.8/update-site/
  3. 选择想要安装的MAT。完成后重启Ecplise 。

独立应用(推荐)

打开下载页面:http://www.eclipse.org/mat/downloads.php

通常而言,分析一个堆转储文件会消耗很多的堆空间。为了保证分析的效率和性能,建议分配给MAT更多的内存资源(依据需分析的堆转储文件大小而定)。通常我们可以使用两种方式来分配内存给MAT:
修改启动参数 MemoryAnalyzer.exe -vmargs -Xmx2g
编辑文件MemoryAnalyzer.ini,添加信息 -vmargs -Xmx2g 。

获取堆转储文件

我们首选需设置JVM参数。

 -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=堆转储文件存放目录

当发生内存泄漏时,JVM会抓拍当时的内存状态,生成的文件就是我们想要的堆转储文件。除了设置JVM参数外,还有很多工具,例如JMap,JConsole都可以帮我们获取一个堆转储文件。

生成分析报告

  1. 启动MemoryAnalyzer.exe,导入堆转储文件
    图片描述
  2. 文件越大,加载时间越长。加载完成后,会生成如下概览
    图片描述
  3. 通过 Reports Leak Suspects,生成内存泄漏分析概述报告。很明显,占用了程序91.90%内存的是 org.apache.catalina.session.StandardManager,而org.apache.catalina.loader.StandardCalssLoader负责加载此对象。但真正占据大量内存的,是StandardManager中的java.util.concurrent.ConcurrentHashMap$Segment[],是的,它才是引起OOM的“罪魁祸首”。
    图片描述
  4. 点击 Detalls >> ,可以查看更详细的报告。下图为从根元素到内存消耗聚集点的最短路径。我们可以很清晰地看到整个引用链,内存聚集点是一个拥有大量对象的集合。
    图片描述
  5. 查看内存消耗聚集点对象的支配树
    图片描述
  6. 查看支配树根节点聚集对象的类型,实例数,堆内存占用情况
    Shallow Heap:对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和
    Retained Heap:是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。
    图片描述
  7. 查看所有聚集对象的类型,实例数,内存占用情况,以占用内存大小的倒序排列
    图片描述
  8. 我们终于找到导致内存泄漏OOM,真正的追魁祸首:foxking.entity.Cpzl_market
    Cpzl_market实例数达到140多万。找到了导致OOM的原因,我们就可以分析代码,找出修改方案。
点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
26
获赞与收藏
15

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消