使用MAT(Memory Analyzer Tool)工具分析dump文件--转

时间:2022-03-13 10:01:36

原文地址:http://gao-xianglong.iteye.com/blog/2173140?utm_source=tuicool&utm_medium=referral

前言

生产环境中,尤其是吃大内存的JVM,一旦出现内存泄露等问题是非常容易引发OutofMemory的,如果没有一个好的工具提供给开发人员定位问题和分析问题,那么这将会是一场噩梦。目前JDK其实自带有一些内存泄露分析工具专门用于帮助开发人员定位内存泄露等问题,但是这些工具往往并不是能够满足一些现状,这里笔者所指的现状更多是迅速、便捷、高效的定位出问题,方便开发人员迅速进行调整。

目录

一、使用jmap工具生成dump文件

二、MAT工具的下载和安装

三、使用MAT工具进行内存泄露分析

一、使用jmap工具实现堆转储、

jmap是什么?简单来说,jmap是JDK自带的一种用于生成内存镜像文件的工具,通过该工具,开发人员可以快速生成dump文件。开发人员可以使用命令“jmap -help”查看jmap的常用命令,如下所示:

  1. Usage:
  2. jmap [option] <pid>
  3. (to connect to running process)
  4. jmap [option] <executable <core>
  5. (to connect to a core file)
  6. jmap [option] [server_id@]<remote server IP or hostname>
  7. (to connect to remote debug server)
  8. where <option> is one of:
  9. <none>               to print same info as Solaris pmap
  10. -heap                to print java heap summary
  11. -histo[:live]        to print histogram of java object heap; if the "live"
  12. suboption is specified, only count live objects
  13. -permstat            to print permanent generation statistics
  14. -finalizerinfo       to print information on objects awaiting finalization
  15. -dump:<dump-options> to dump java heap in hprof binary format
  16. dump-options:
  17. live         dump only live objects; if not specified,
  18. all objects in the heap are dumped.
  19. format=b     binary format
  20. file=<file>  dump heap to <file>
  21. Example: jmap -dump:live,format=b,file=heap.bin <pid>
  22. -F                   force. Use with -dump:<dump-options> <pid> or -histo
  23. to force a heap dump or histogram when <pid> does not
  24. respond. The "live" suboption is not supported
  25. in this mode.
  26. -h | -help           to print this help message
  27. -J<flag>             to pass <flag> directly to the runtime system

在此大家需要注意,jmap工具有一部分命令仅限于Linux和Solaris平台,而Windows平台下能够使用的命令只有“jmap -histo<pid>”和“jmap -dump:<dump-options><pid>”。不过一般来说,使用命令“jmap -dump:<dump-options><pid>”生成dump文件应该是最常用的命令之一,由于生成dump文件时比较耗时的,因此大家需要耐心等待,尤其是大内存镜像生成dump文件则需要耗费更长的时间来完成。

二、MAT工具的下载和安装

MAT(Memory Analyzer Tool)工具是eclipse的一个插件,使用起来非常方便,尤其是在分析大内存的dump文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系、利用OQL对象查询,以及可以很方便的找出对象GC Roots的相关信息,当然最吸引人的还是能够快速为开发人员生成内存泄露报表,方便定位问题和分析问题。

MAT工具的下载地址为:http://www.eclipse.org/mat/downloads.php

MAT插件的下载地址为:http://download.eclipse.org/mat/1.3/update-site/

笔者所使用的MAT工具的版本为最新的1.4.0,为了避免在实际使用过程中出现一些不必要的异常情况,笔者建议大家使用与笔者相同版本版本的MAT工具分析dump文件。

只要确保机器上成功装有JDK并配置好相关的环境变量后,运行“MemoryAnalyzer-1.4.0.20140604-win32.win32.x86\mat\”目录下的MemoryAnalyzer.exe即可成功启动MAT工具。

三、使用MAT工具进行内存泄露分析

当大家成功下载和安装好MAT后,接下来要做的事情就是使用jmap+MAT工具一起进行内存泄露工作的分析。首先笔者先准备一段测试代码,如下所示:

  1. /**
  2. * -server -Xms1024m -Xmx1024m -Xmn384m -XX:+UseParallelOldGC
  3. * -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails
  4. * -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:/heap.bin
  5. */
  6. public class GCTest {
  7. public static void main(String[] args) {
  8. final int _1mb = 1024 * 1024;
  9. byte[] value1 = new byte[_1mb * 100];
  10. byte[] value2 = new byte[_1mb * 100];
  11. byte[] value3 = new byte[_1mb * 100];
  12. new Thread() {
  13. public void run() {
  14. byte[] value4 = new byte[_1mb * 400];
  15. }
  16. }.start();
  17. byte[] value5 = new byte[_1mb * 200];
  18. }
  19. }

在上述代码示例中,具体的VM参见类注释,而选项“-XX:+HeapDumpOnOutOfMemoryError ”和-“XX:HeapDumpPath”所代表的含义就是当程序出现OutofMemory时,将会在相应的目录下生成一份dump文件,而如果不指定选项“XX:HeapDumpPath”则在当前目录下生成dump文件。在此大家需要注意,尽管不借助jmap工具,MAT工具也能够直接生成dump文件,但是考虑到生产环境中几乎不可能在线对其进行分析,大都是采用离线分析,因此使用jmap+MAT工具是最常见的组合。

当上述程序执行时,必然会触发OutofMemory,然后在所指定的目录下找到生成的dump文件后,我们便可以通过MAT工具来进行分析了。当成功启动MAT后,通过菜单选项“File->Open heap dump...”打开指定的dump文件后,将会生成Overview选项,如图1-1所示:

使用MAT(Memory Analyzer Tool)工具分析dump文件--转

图1-1 Overview选项

在Overview选项中,以饼状图的形式列举出了程序内存消耗的一些基本信息,其中每一种不同颜色的饼块都代表了不同比例的内存消耗情况。如果说需要定位内存泄露的代码点,我们可以通过Dominator Tree菜单选项来进行排查(MAT工具仅仅只是一个辅助,分析OutofMemory并不存在一个固定的方式和准则,因此仔细观察和分析才能够找到问题所在),如图1-2所示:

使用MAT(Memory Analyzer Tool)工具分析dump文件--转

图1-2 Dominator Tree选项

使用MAT(Memory Analyzer Tool)工具分析dump文件--转的更多相关文章

  1. MAT&lpar;Memory Analyzer Tool&rpar;工具入门介绍

    1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...

  2. MAT&lpar;Memory Analyzer Tool&rpar;工具入门介绍&lpar;转&rpar;

    1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...

  3. 【转】MAT&lpar;Memory Analyzer Tool&rpar;工具入门介绍

    1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...

  4. MAT&lpar;Memory Analyzer Tool&rpar;内存分析工具的使用

    开发.应用中老是会遇到OutOfMemory异常,而且常常是过一段时间内存才被吃光,这里可以利用java heap dump出jvm内存镜像,然后再对其进行分析来查找问题. 平常利用jmap -dum ...

  5. &lbrack;性能测试&rsqb;:内存泄漏以及MAT&lpar;Memory Analyzer Tool&rpar;工具使用分析

    一.今天在查看服务器时候,发现内存使用率直接就到99%了, 二.用ps -uaxw查看一下,每个占用内存较多的进程情况: 三,挑出可疑的进程,生成dump文件: jmap -dump:format=b ...

  6. 内存分析工具-MAT&lpar;Memory Analyzer Tool&rpar;

    内存分析工具-MAT(Memory Analyzer Tool) 首先查看如下代码,main函数中有一个成员变量map,map里被循环放入对象Hanson,hanson持有姓名和age还有friend ...

  7. MAT Memory Analyzer Tool 插件安装&lpar;图解&rpar;

    MAT Memory Analyzer Tool 插件安装(图解) 原文地址 @author YHC 前段时间做了一个项目,Exception in thread "main" j ...

  8. Android 内存分析工具 MAT&lpar;Memory Analyzer Tool&rpar;

    如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...

  9. 转载:MAT Memory Analyzer Tool使用示例

    地址:http://blog.csdn.net/yanghongchang_/article/details/7711911 以下是一个会导致java.lang.OutOfMemoryError: J ...

随机推荐

  1. oracle 和c3p0 数据库的Time&lowbar;Wait 过多问题的一个解决方案。

    项目是B/S模式,放在linux服务器上,tomcat和oracle11g在一台服务器上,tomcat读取数据库采用C3P0连接池,一直比较稳定,所以也没有去管.后来把tomcat放在一台win200 ...

  2. 第一篇博文,整理一下关于Mac下安装本地LNMP环境的一些坑

    安装的主要步骤是按照以下这篇文章进行的http://blog.csdn.net/w670328683/article/details/50628629,但是依然遇到了一些大大小小的坑(一个环境搞了一天 ...

  3. SSH无密码登录

    首先生成密钥对 ssh-keygen -t rsa cd ~/.ssh/ cat id_rsa.pub 复制你生成的公钥 登录到需要免登录的服务器 cd ~/.ssh 添加到 authorized_k ...

  4. Linux中执行shell脚本的4种方法

    bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在 ...

  5. CXF 与Spring整合配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java ...

  6. jQuery鼠标事件

    鼠标事件是在用户移动鼠标光标或者使用任意鼠标键点击时触发的.   (1):click事件:click事件于用户在元素敲击鼠标左键,并在相同元素上松开左键时触发.        $('p').click ...

  7. &lbrack;学习笔记&rsqb;--Jfinal 表单提交附件

    近期.项目里面用到了Jfinal 里面的上传附件. Jfinal 的Controller 里面提供了一个 getFile系列方法提供文件上传. 我这里呢,是文件上传和表单參数一起提交. 页面类似下图: ...

  8. 自己封装的C&num;操作redis公共类

    关于C#操作redis公共类,网上有很多版本,每个版本我都看了,发觉还是不够完美,都存在一个问题,只能操作单一的缓存数据库 redis指令支持上,这里可以自己去扩展,下面分享下我近期封装的一个redi ...

  9. Linux Shell编程(17)——嵌套循环

    嵌套循环就是在一个循环中还有一个循环,内部循环在外部循环体中.在外部循环的每次执行过程中都会触发内部循环,直到内部循环执行结束.外部循环执行了多少次,内部循环就完成多少次.当然,不论是外部循环或内部循 ...

  10. bootstrap-js&lpar;六&rpar;弹出框

    实例 为任意元素添加一小块浮层,用于存放非主要信息. 弹出框的标题和内容的长度都是零的话将永远不会被显示出来. 初始化 由于性能的原因,工具提示和弹出框的 data 编程接口(data api)是必须 ...