Eclipse中安装MemoryAnalyzer插件及使用
Eclipse中安装MemoryAnalyzer插件
一、简介
Eclipse作为JAVA非常好用的一款IDE,其自带的可扩展插件非常有利于JAVA程序员的工作效率提升。
MemoryAnalyzerTool(也叫MAT)是一款JAVA虚拟机内存映像分析工具,可以在JAVA程序运行的时候有程序抛出的异常加上已经设置好的参数(-XX:+HeapDumpOnOutOfMemory)调试出内存泄漏或者异常的位置以及原因跟踪,MemeoryAnalyzer可以对Dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是有必要的,也就是要先确认到底是出现了内存泄漏(Memory Leak)还是内存溢出(Memory OverFlow)。
二、准备工作
1.Eclipse IDE:我的是安装的Eclipse Neon3,大部分版本Eclipse都支持插件安装。
名称:Eclipse Neon
版本:3
下载地址:https://www.eclipse.org/downloads/packages/release/neon/3(我的是Windows64位的JavaEE版本)
2.Memory Analyzer Tool(MAT):由于Eclipse支持直接从URL导入包快捷安装,以及下载压缩包后导入安装,下载包在Eclipse官网中能很快找到:
名称:Memory Analyzer
版本:最新版1.7.0.20170613
官网下载地址:https://eclipse.org/mat/downloads.php
里面有三种:
1.Eclipse导入的URL,特点:安装简单快捷,不需要自己去手动下载,直接输入URL由Eclipse帮你自动下载;
2.Eclispe导入的zip,特点:自己下载,当Eclipse自带工具下载较慢的时候可以使用自己下载然后导入zip即可;
3.独立的MemoryAnalyzer工具,特点:自行下载,不依赖于Eclipse的启动,可直接独立导入.hprof文件进行分析。
三、开始安装MAT
运行Eclipse,然后单击菜单栏上“Help=》Install New Software...”
进入软件源导入界面,你可以选择使用URL直接导入,URL导入的地址为:
- http://download.eclipse.org/mat/1.7/update-site/
但是由于镜像连接不稳定性,我使用的是下载压缩包zip然后安装,压缩包下载地址为:http://ftp.jaist.ac.jp/pub/eclipse/mat/1.7/MemoryAnalyzer-1.7.0.201706130745.zip
下载完成之后将其导入,"Add》Archive》选择你下载好的zip文件》OK":
确定之后勾选"Memory Analyzer for Eclipse IDE"下面的两项即可,这个是用于Eclipse内部使用的插件,下面一个“Stand-alone Memory Analyzer“是独立的分析工具,一般不用勾选。
之后单击“Next"等待一段时间Eclipse计算的需求和依赖文件下载完毕后,一路"next",并接受协议“Finish”即可完成安装,重启Eclispe后就可以使用MAT了。
四、MAT的简单使用
1.设置JVM参数
JVM的参数可以用于调试JVM在各种限制条件下的常见BUG,一下简单介绍几个参数:
- -XX:+HeapDumpOnOutOfMemoryError //虚拟机在堆异常时生成对存储快照,后缀一般是.hprof
- -Xms //Java堆的最小值,例如-Xms20m,将Java堆的最小值设置为20MB
- -Xmx //Java堆的最大值,例如-Xms40m,将Java堆的最大值设置为40MB
了解了参数之后,可以对参数进行一定的设置,以便我们简单的对MAT工具进行使用测试,设置参数如下:
- -XX:+HeapDumpOnOutOfMemoryError
- -Xms20m
- -Xmx20m
之所以将最小和最大的堆设置为一样是为了能避免堆的自动扩展,以及20MB的空间是为了让程序能尽快的占满使得内存溢出。
设置JVM的启动参数可在“Run》Run Configuration》Arguments》Vm arguments”中填写
2.编写内存溢出(Memory Leak)代码
思路:通过新建集合列表List,然后以while(true)死循环的方式使得List集合不断添加新的对象,使得其不断地占满堆空间
代码:
- package com.study;
- import java.util.ArrayList;
- import java.util.List;
- public class TestStudy {
- static class OOMClass { }
- public static void main(String[] args) {
- List<OOMClass> list = new ArrayList<OOMClass>();
- while(true) {
- list.add(new OOMClass());
- }
- }
- }
执行代码,发现输出如下:
注意到“java_pid24792.hprof”文件,这个文件是JVM生成的对存储快照,之后可以通过MAT工具打开,进行分析追踪,这个文件将自动保存到你的Eclipse workspace下的工作目录中,以我的为例:
3.打开MAT的Perspective
由于MAT工具需要另外打开一个工作视图(就像Eclipse EE和Java的切换视图一样),因此需要在先配置打开"Window》Perspective》Open Perspective》Other...":
选择Memory Analysis并确定:
完后之后将进入MAT的工作空间视图,你可以在Eclipse右上角进行切换回Java或者EE,由于接下来要使用MAT分析,因此就暂时不切回之前的Java了
4.打开需要分析的堆转储快照.hprof文件
由于MAT是依赖于生成的堆转储快照,而不是在运行的时候自动捕获,因此,再确认进入MAT的工作空间后,点击"File》Open Heap Dump》选择刚生成的“java_pid24792.hprof”文件,一直默认就可以查看内存问题的分析图表以及GC根
你可以进行一些分析操作,可以看到Action下的几个选项:
a.Histogram:列出每个类的实例列表;
b.Dominator:列出最大的对象和他们存在的东西;
c.Top Comsumer:打印按类和包分组的最昂贵的对象;
d.Duplicate Classes:检测由多个类加载器加载的类。
5.使用MAT找出问题存在的对象
由于是一个简单的问题,因此我们直接选择Dominator,可以直接以百分比的形式打印出对象所占的百分比,一般的内存溢出大部分情况都是有某一个对象过多存在而未被GC回收导致,所以可以点开最大百分比的类一级级找,不难找到问题所在:
可以看到列出额其中的25条,还有810300条目未列出,这81万个对象占据了97.36%的堆空间,因此不难发现是OOMClass类的对象生成过多为未被回收导致内存溢出。
6.进一步追踪问题源并进行定位
在"default_report org.eclipse.mat.api:suspects"的标签分页中
在"Program Suspect 1》Details"点击后找到"Thread Stack"中追踪出错点
看到出错点在第13行,找到对应的Java代码TestStudy的13行:
- package com.study;
- import java.util.ArrayList;
- import java.util.List;
- public class TestStudy {
- static class OOMClass { }
- public static void main(String[] args) {
- List<OOMClass> list = new ArrayList<OOMClass>();
- while(true) {
- list.add(new OOMClass());
- }
- }
- }
找到了追踪的出错位置,以上就是使用Memory Analyzer工具完成的堆栈分析。
Eclipse中安装MemoryAnalyzer插件及使用的更多相关文章
- 总结eclipse中安装maven插件
当自己越来越多的接触到开源项目时,发现大多数的开源项目都是用maven来够建的.并且在开发应用时,也越来越意识到maven的确会解决很多问题,如果你要了解maven,可以参考:Maven入门指南(一) ...
- SVN工具的使用 和在Eclipse中安装GPD插件:(多步审批流,因此选择使用工作流(JBPM)来实现)
前言 重点解说SVN工具的还原版本号. 1.提交svn之前.要先更新文件.假设更新之后有版本号冲突的话.就线下解决掉冲突,在把该文件标记为已经解决冲突. 正文 使用SVN还原历史版本号 water ...
- 在Eclipse中安装spket插件
spket是一个开发JavaScript和Ext等的开发工具,它可以 是独立的IDE,也可以作为 Eclipse的插件使用,下面介绍如何在Eclipse中安装spket插件, 1.首先上 官网 htt ...
- eclipse中安装freemarker插件及ftl使用freemarker编辑器
http://www.07net01.com/2015/08/895212.html eclipse中安装freemarker插件及ftl使用freemarker编辑器 在线安装的方法是:Help – ...
- 在eclipse中安装groovy插件
在eclipse中安装groovy插件详细步骤: step 1:检查自己的eclipse版本:在help->About Eclipse中查看: step 2:进入 https://github. ...
- 在eclipse中安装properties插件PropertiesEditor及设置(附图),ASCII码转换成中文
在eclipse中安装properties插件PropertiesEditor及设置(附图),ASCII码转换成中文安装成功后ASCII还是不能转换成中文的,原因是设置里面没有把编码设置为utf8的, ...
- eclipse中安装pydev插件出现duplicate location
eclipse中安装pydev插件出现duplicate location,主要是因为之前已经填写了该地址并且已经加载了,具体的解决办法见下链接: http://jingyan.baidu.com/a ...
- 在Eclipse中安装python插件的方法
一个博士给了我一堆代码,原本以为是C++或者java写的,结果是python,我压根没学过呀,不过本着语言都是相通的原则,我硬着头皮开始学习Python,当然先学习安装IDE(以前学习一门新语言,我会 ...
- 如何在eclipse中安装angularjs插件
1,首先,在eclipse中使用angularjs的时候,由于没有相应的提示,导致在开发的时候给我们带来了很多的不便,需要在这上面耗费一些时间.那么这时候我们都在想可不可以让eclipse也和一些前端 ...
随机推荐
- 纯CSS3实现圆形进度条动画
悄悄地,GIF 格式的进度条已经越来越少,CSS 进度条如雨后春笋般涌现.今天要介绍的这个 CSS3 进度条,效果和 Flyme OS 4 上的加载动画一样. 首先,来看下最终的效果: 它的 HTML ...
- PHP按值合并数组
/** * PHP按值合并数组 * */ function my_array_merge(&$array1, &$array2) { $result = Array(); foreac ...
- Java 9 揭秘(6. 封装模块)
Tips 做一个终身学习的人. 在这章节中, 主要介绍以下内容: 封装Java模块的不同格式 JAR格式增强 什么是多版本JAR 如何创建和使用多版本JAR JMOD是什么格式 如何使用jmod工具来 ...
- java网络编程之socket(2)
异步处理多客户端连接服务端 上篇讲到的是服务端接收一个客户端的请求之后就结束了,不能再接收其他客户端的请求了,实际情况上我们希望服务端能够处理来自不同用户的请求. 想到这里,或许我们可以用一个死循环, ...
- 使用Cain&Abel进行网络嗅探
启动Cain&Abel并切换到"sniffer(嗅探)"标签. 第一步:需要对Cain&Abel进行配置,先单击最上面的"Configure(配置)&qu ...
- peoplesoft function PSTREENODE 通过 deptid 获得部门树 一级部门 code
create or replace function ht_gettopdeptid(deptid in varchar) return varchar2 is r ); c int; m ); r_ ...
- tp5框架的获取器
tp5的获取器功能很强大,一下子就喜欢上了,你可以在模块里任意定义表里不存在的字段,在前台调用很方便.话不多说直接上demo: 1.命名规则 get + 属性名的驼峰命名+ Attr 直接就能在m ...
- VB6之SOAP
根据网上搜来的资料,MS有个组件可以用来支撑VB6访问SOAP接口. 于是下载了个msSoapToolkit.exe安装后试了下,发现确实可以访问用C#或者VB.net写的webservice. 但是 ...
- SpringMvc多视图配置(jsp、velocity、freemarker) 在src目录views.properties配置
#welcome为modelAndView.setViewName(" welcome " ) ; 中的welcome .(class)固定写法 welcome.(class)=o ...
- maven Spring+Spring MVC+Mybatis+mysql轻量级Java web开发环境搭建
之前一直在做的一个GIS系统项目,采用了jsp+servlet框架,数据传输框架采用了apache的thrift框架,短时多传的风格还不错,但是较其他的java web项目显得有点太臃肿了,现在给大家 ...