在学习 JVM过程中使用到两个软件:
Java Visualvm用于演示对象分配过程;
JProfiler 用于排查出现异常的问题所在,有利于 JVM调优。
JProfiler 测试版本:11.0
Java Visualvm:1.8
JDK:1.8
IDEA:2019.1
1.写一个会OOM的程序
public class Main {
public static void main(String[] args) {
//StackOverflowError
//main(args);
//OutOfMemoryError
List<JPerson> list = new ArrayList<>();
while (true) {
list.add(new JPerson(new Random().nextInt(1024 * 1024)));
}
}
}
class JPerson {
public JPerson(Integer byt) {
}
}
2.在Idea中通过 Run->Edit Configuration
进入参数设置
- List item
- -Xms100m:设置初始堆为100M
- -Xss100m:设置初始栈为100M
- -Xmx1024M:设置最大堆为1024M(如果值设的太大或者没设置最大堆,则在测试的时候出现OOM会比较久)
- -XX:+HeapDumpOnOutOfMemoryError:当出现OOM时,生成Dump文件
3.在IDEA通过show in Explorer
,即类所在本地目录的上一级目录会生成对应的Dump文件,双击打开文件。
4.可以看到 JPerson占的百分比非常大,初步判断是程序中 JPerson出问题
5.因为本次代码在 Main线程运行,所以通过main线程可以进一步追踪问题,由main所显示的具体信息(从下往上看)可知,是 main线程中 ArrayList中的 add()方法导致OOM。
另外再介绍一个动态查看堆中各个分区变化的工具:Java Visualvm
找到对应的线程,查看Visualvm GC即可。