在上篇文章5分钟直观了解JAVA内存泄露我们对JAVA的内存泄露有了直观的认识,这篇文章将介绍如何用MemoryAnalyzer分析内存泄露
在实际项目中我们不可能盯着屏幕看到outofmemoryerror, 而是希望当发生内存泄漏时将虚拟机堆内存打印出来,对堆内存进行分析,从而定位出问题
首先我们将代码稍加改变,让程序自动发生内存泄露
1. 自动产生内存泄露
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class memoryLeak {
public static void main(String[] args){
System.out.println("Start demo.....");
List<int[]> theList = new ArrayList<int[]>();
InputStream in = System.in;
while (true){ //无限循环,自动产生内存泄露
try {
int[] arr = new int[1024 * 1024];
theList.add(arr);
}catch (Exception e){
e.printStackTrace();
}
}
}
}
javac memoryLeak.java
2. dump heap
配置虚拟机参数,让内存泄露时内存布局输出到文件
运行 java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/test/file.hprof memoryLeak
随后可以看到dump 文件的产生
3. 利用MemoryAnalyzer 分析文件
打开memoryAnalyzer 打开file.hprof ,可以看到memory leak 的分析
leak sucpect 查看详情
通过上图可以看出内存泄露的原因,以及具体位置