今天我们来一起学习一下如何利用MAT(Memory Analyzer Tool)快速的定位Java程序的内存泄漏问题。本文实验环境为Mac下安装独立版的MAT。
先来科普一下MAT:
Eclipse Memory Analyzer是一个快速的并且功能丰富的Java堆分析工具,旨在帮助你发现内存泄漏问题和减少内存消耗。
使用MAT来分析生产数以亿计的对象堆转储文件,快速计算存活对象的大小,发现谁在阻碍GC回收对象,形成一个报告来自动提取内存泄漏嫌疑对象。
安装独立版本的MAT
官网下载Memory Analyzer 1.9.0 Release,下载地址:
01 第一步打开matlab,在命令行窗口中输入a=[1 2 3 4 5 6],按回车键之后,输入save a,将a变量保存在新生成的a.mat文件,如下图所示:02 第二步按回车键之后,在当前文件夹中,可以看到新生成的a.mat文件,需。
MAT官网下载
下载zip包解压后,即可双击运行应用程序,MAT欢迎页面:
MAT欢迎页
MAT帮助文档
以上,Java Heap Dump分析工具就安装好了,接下来要做的就是来本地创造一个dump文件,来试试这个工具如何使用。
本地获取Heap Dump文件
写一个简单的类并运行来获取Heap Dump文件:
直接双击mat文件,或者输入指令:load('XXX.mat'),其中,XXX为mat文件的文件名。然后,就会看见workspace窗口出现mat文件存储的数据了。
TestMemortLeak.java
配置一下启动参数:
-Xms128m -Xmx256m -XX:MaxPermSize=256m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/edz/testMemoryLeak
运行main方法会报错如下:
获取Heap Dump
Java Heap Dump文件已到手,开始分析!
MAT分析Java Heap Dump文件
MAT打开本地dump文件,选择Leak Suspects Report:
Leak Suspects Report
dump文件分析结果总览
stacktrace
立刻便能定位程序中内存泄漏的问题代码了。
接下来我们介绍如何通过Jmap来获取Java Heap Dump文件。
mat是MATLAB的一个数据文件,可以通过双击直接导入。或者通过命令窗口输入命令并写入要导入的m文件。如果当前目录中是file1.mat,则直接输入loadfile1。如果不在当前目录中,请输入load(['目录\file1.mat'])。如果file
jmap -h
jps、ps -ef|grep java、ps -ef|grep 项目名称 均可
你可以调用matlab的子程序库,用c或fortan调用mat格式的数据。matopen 打开mat文件 matclose 关闭mat文件 magetfp 取得mat文件的c语言句柄 matGetArray 取得一个数组 具体内容看联机文档 用matlab即可打开 推荐matlab7.0.
然后获取转储文件:
mat是matlab的数据文件,可以直接双击导入\x0d\x0a或者通过命令窗输入命令以及编写m文件导入\x0d\x0a\x0d\x0a如果是当前目录下的文件file1.mat,直接输入load file1\x0d\x0a如果不是当前目录下的,输入 load(['。
jmap -dump:live,format=b,file=dump.phrof 31824
把服务器上的dump.phrof文件下载到本地用MAT打开,开启你的分析之路吧~