- 堆内存溢出时,系统会抛出异常并退出:
java.lang.OutOfMemoryError: Java heap space
- GC 日志不用分析,因为堆内存溢出往往对应着大量的 GC 日志,频繁的 GC,所以分析起来很麻烦;
- 直接基于 MAT 分析 内存快照即可;
(1) 演示代码
public class Demo3 {
public static void main(String[] args) {
long counter = 0;
List<Object> list = new ArrayList<>();
while(true){
list.add(new Object());
System.out.println("当前创建了第"+(++counter)+"个对象");
}
}
}
(2) JVM 参数
-Xms1m
-Xmx1m
-XX:+PrintGCDetails
-Xloggc:gc.log
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
(3) 基于 MAT 分析堆内存
- main 线程通过局部变量引用了 949,192 个字节的对象;
- 内存都被一个实例对象占用了,就是 java.lang.Object[]。
- 这里可以看到 Object[] 里面的每个元素,就是一堆的 java.lang.Object;
- 这里可以看到线程执行什么方法的时候创建了一大堆的对象;