菜鸟,有不对的地方希望大神指导,有两种方法来查找问题
1. 设置项目启动参数 生成快照文件
在VM options中配置:-XX:+HeapDumpOnOutOfMemoryError(此配置是为了在项目根目录生成 java_pidxxxx.hprof文件 也就是快照文件)
后面的-Xms20m -Xmx20m 可以忽略只是测试为了节省时间
2. 情景重现
/**
* @Author jijl
* @Description: 无限创建对象导致堆内存爆满
* @Date 16:07 2018/10/11
* @Param
* @return
**/
public class Main {
public static void main(String[] args){
List<User> list = new ArrayList<>();
int i =0;
while(true){
list.add(new User());
System.out.println("new User()"+i);
i++;
}
}
}
运行后控制台信息
new User()810320
new User()810321
new User()810322
new User()810323
new User()810324
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid4948.hprof ...
Heap dump file created [28238419 bytes in 0.068 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:261)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
at java.util.ArrayList.add(ArrayList.java:458)
at Main.main(Main.java:15)
Process finished with exit code 1
注意:控制台输出 Dumping heap to java_pid4948.hprof … 表示在根目录生成了java_pid4948.hprof快照文件
我们就可以下载快照分析工具来分析这个快照文件了,java有很多分析工具可自行下载(也可使用下面的JProfiler),这是一种方法,但是IDEA有更简单的方法。
3. 下载安装快照分析工具
JProfiler下载
4.IDEA 安装JProfiler插件
安装完之后会多出两个按钮
接下来我们用新增的第一个那个蓝色按钮启动
会跳出这个页面选择第三个点ok即可
点击live memory
很容易就能分析出 是User类占用内存最多