- 堆内存溢出时,系统会抛出异常并退出:
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;

- 这里可以看到线程执行什么方法的时候创建了一大堆的对象;
