一、使用工具
Eclipse Memory Analyzer tool, 简称MAT
下载地址:http://www.eclipse.org/mat/downloads.php
二、生成heap dump file (内存溢出时,自动生成)
1、问题代码
package com.mfy.vo;
public class User {
private int id = 111;
private String name ="aaaaaaas";
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.mfy.util;
public class LogTest {
public static void main(String[] args) {
oom();
}
private static void oom(){
Map<String, User> map = new HashMap<String, User>();
Object[] array = new Object[10000000];
for(int i=0; i<10000000; i++){
User p = new User();
map.put(i+"rosen jiang", p);
array[i]=p;
}
System.out.print("OK");
}
}
2、添加jvm参数
-Xms60m
-Xmx100m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\dev\log (如果不设置该参数,默认日志文件生成路径在工程根目录下)
运行程序,如果发生了内存溢出,将生成文件名如java_pid10636.hprof的文件。
控制台打印出如下日志:
java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:\dev\log\java_pid9212.hprof ...
Heap dump file created [158609927 bytes in 0.696 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.resize(HashMap.java:462)
at java.util.HashMap.addEntry(HashMap.java:755)
at java.util.HashMap.put(HashMap.java:385)
at com.mfy.util.LogTest.oom(LogTest.java:28)
at com.mfy.util.LogTest.main(LogTest.java:20)
三、生成heap dump file(java命令生成)
只需要指定进程号即可。
如:
ps -ef|grep tomcat
jmap -dump:format=b,file=outfile.hprof 15088
四、分析heap dump file