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

标签: mat memory analyzer | 发表时间:2015-01-06 16:09 | 作者:
出处:http://gao-xianglong.iteye.com

《使用MAT(Memory Analyzer Tool)工具分析dump文件》

 

前言

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

 

目录

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

二、MAT工具的下载和安装

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

 

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

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

Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -permstat            to print permanent generation statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -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工具一起进行内存泄露工作的分析。首先笔者先准备一段测试代码,如下所示:

/**
 * -server -Xms1024m -Xmx1024m -Xmn384m -XX:+UseParallelOldGC
 * -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails
 * -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:/heap.bin
 */
public class GCTest {
	public static void main(String[] args) {
		final int _1mb = 1024 * 1024;
		byte[] value1 = new byte[_1mb * 100];
		byte[] value2 = new byte[_1mb * 100];
		byte[] value3 = new byte[_1mb * 100];
		new Thread() {
			public void run() {
				byte[] value4 = new byte[_1mb * 400];
			}
		}.start();
		byte[] value5 = new byte[_1mb * 200];
	}
}

 

在上述代码示例中,具体的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所示:

图1-1 Overview选项

 

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

 

图1-2 Dominator Tree选项

 

就这样吧,懒得写了。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [mat memory analyzer] 推荐:

使用Memory Analyzer tool(MAT)分析内存泄漏

- - 移动开发 - ITeye博客
前言的前言:本文是自2005年8月以来,首次在一个月之内发布三篇文章. 谨以此文献给这么多年始终不济的我. 北漂快两年了,何时能回到故乡,回去后又会怎样,也许永远是个未知……. 在平时工作过程中,有时会遇到OutOfMemoryError,我们知道遇到Error一般表明程序存在着严重问题,可能是灾难性的.

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

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

Eclipse Memory Analyzer简介

- - Java - 编程语言 - ITeye博客
Eclipse Memory Analyzer是一个非常棒的堆内存分析工具,是JDK自带的堆分析工具jhat的一个非常好的替代品,能够快速地定位Java内存泄露的原因.       可能有的同学会问,JVM不是号称自动内存管理,GC会自动垃圾回收,Java怎么会有内存泄露,不会搞错吧.       在开始分析之前,我们先想想,在编程这个角度上,我们如何避免堆内存泄露呢.

一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

- -
在平时开发、测试过程中、甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题. 我们需要找造成OutOfMemoryError原因. 1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;. 2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况.

memory prefetch浅析

- - 搜索技术博客-淘宝
最近在用vtune分析程序性能瓶颈时,发现一些内存访问的地方竟然成了cpu热点. 经过仔细分析,发现这些热点主要是对大数组非连续位置的访问的引起的. 比较消耗cpu的原因应该是cache不命中. 因为像这样局部性很差的内存访问逻辑,对cache是很不友好的. 于是想到了prefetch……. x86(以及其他很多体系结构)的CPU提供了prefetch系列指令,用于将指定地址的内存预取到cache.

MAT使用入门

- - 移动开发 - ITeye博客
原文出处:  高建武 (Granker,@高爷)   . MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗. 使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象.

ORACLE SQL Performance Analyzer的使用

- - CSDN博客数据库推荐文章
通过 SPA,您可以根据各种更改类型(如初始化参数更改、优化器统计刷新和数据库升级)播放特定的. SQL 或整个 SQL 负载,然后生成比较报告,帮助您评估它们的影响.. 在 Oracle Database 11g 之前的版本中,我必须捕获所有 SQL 语句,通过跟踪运行这些语句,. 然后得到执行计划 — 这是一项极其耗时又极易出错的任务.

JVM性能调试之mat

- - ITeye博客
mat为eclipse的一个内存分析插件,帮助查找内存泄漏和减少内存消耗. 首先基于jmap导出的堆信息. jmap导出参见另一则博客.  执行之后用jmap输出堆信息. 我们可以看到图形化展示:.  我们可以看到有很多的User对象.  这些对象有可能会溢出,然后我们打开OQL窗口看他是否为null,执行如下OQL语句.

MAT JVM内存分析

- - 开源软件 - ITeye博客
我们使用的是 Eclipse Memory Analyzer V0.8,Sun JDK 6. 和其他插件的安装非常类似,MAT 支持两种安装方式,一种是“单机版“的,也就是说用户不必安装 Eclipse IDE 环境,MAT 作为一个独立的 Eclipse RCP 应用运行;另一种是”集成版“的,也就是说 MAT 也可以作为 Eclipse IDE 的一部分,和现有的开发平台集成.

浅谈Cache Memory--目录

- chuang - Sailing
第1章 有关Cache的思考. 1.1 Cache不可不察也. 第2章 Cache的基础知识. 2.1 Cache的工作原理. 2.2 Cache的组成结构. 2.4 Cache Block的替换算法1. 2.4 Cache Block的替换算法2. 第3章 Coherency and Consistency.