概述
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中,也可以作为独立的应用运行。
安装插件
- 通过HELP --> Software Updates 启动软件更新管理向导。
- 添加一个新的Repository。位置(L):http://download.eclipse.org/technology/mat/0.8/update-site/
- 选择想要安装的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都可以帮我们获取一个堆转储文件。
生成分析报告
- 启动MemoryAnalyzer.exe,导入堆转储文件
- 文件越大,加载时间越长。加载完成后,会生成如下概览
- 通过 Reports Leak Suspects,生成内存泄漏分析概述报告。很明显,占用了程序91.90%内存的是
org.apache.catalina.session.StandardManager
,而org.apache.catalina.loader.StandardCalssLoader
负责加载此对象。但真正占据大量内存的,是StandardManager
中的java.util.concurrent.ConcurrentHashMap$Segment[]
,是的,它才是引起OOM的“罪魁祸首”。
- 点击 Detalls >> ,可以查看更详细的报告。下图为从根元素到内存消耗聚集点的最短路径。我们可以很清晰地看到整个引用链,内存聚集点是一个拥有大量对象的集合。
- 查看内存消耗聚集点对象的支配树
- 查看支配树根节点聚集对象的类型,实例数,堆内存占用情况
Shallow Heap:对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和
Retained Heap:是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。
- 查看所有聚集对象的类型,实例数,内存占用情况,以占用内存大小的倒序排列
- 我们终于找到导致内存泄漏OOM,真正的追魁祸首:
foxking.entity.Cpzl_market
Cpzl_market
实例数达到140多万。找到了导致OOM的原因,我们就可以分析代码,找出修改方案。
共同学习,写下你的评论
评论加载中...
作者其他优质文章