前景:
终于来到了JVM的学习,今天主要熟悉一下MAT这个工具的使用
安装:
由于我们在本机上使用,作为学习,不存在正在进行的进程,所以总是将文件dump出来后然后分析
导出文件
导出文件的方法
1、jmap
2、配置参数,-XX:+HeapDumpOnOutMemoryError,让虚拟机出现OOM异常之后自动生成dump文件,对于我们初学,这样就行了
就好像eclipse里面会出现这样:
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid9727.hprof ...
Heap dump file created [15435019 bytes in 0.021 secs]
下载:
http://www.eclipse.org/mat/downloads.php
解压命令unzip,解压到当前文件夹
启动
启动需要在命令行中,像这样
dream@love_lyy:~/mat$ ./MemoryAnalyzer
然后选中红框,打开之前保存的文件,选择
这个呢,主要是自动检查内存的泄露,哪些对象仍然存活为什么它们没有被回收
分析
总图:
这个时候你就已经进入到了分析的界面
我们可以看到这个里面的一个Problem Suspect(问题猜测),它说这个线程保存本地变量占用了97.42%,内存被一个类的对象实例堆积了,点击红框查看细节部分
如果有GC root的路径那么这个聚集点不会被回收,我们可以看到这个问题出现在main中的ArrayList上面
测试的源代码
public class Test
{
public static void main(String[] args)
{
List<String> aList = new ArrayList<String>();
while (true)
{
aList.add("123");
}
}
}
我们可以看到下面的main线程栈的详细内容,正如我们的代码所看到的,这里我们测试的是内存溢出(堆),同时这边也出现了内存泄露。
总结
这便是最简单的查看内存泄露和溢出的方法,软件功能很强大,这里我们用到的分析还是浅薄的,不过掌握一点点技巧,以后会有用的