1 从OutOfMemory说起

170 阅读1分钟

最近在youtube看到一个讲解JVM的课程,感觉受益匪浅。所以想写这个系列作为观看视频的感想和总结 下面是一段会导致OutOfMemory异常的code

public class OutOfMem1 {
  public static void main(String[] args) {
    List<Demo> demos = new ArrayList<>();
    while (true){
      demos.add(new Demo());
    }
  }
  static class Demo{}
}

上例虽然会导致异常,但是需要等待一段时间,尤其是电脑配置较高时,等待的时间更长。为了减少等待时间,可以添加一些jvm选项。以Intellij为例,你可以通过 编辑项目的配置来添加如下jvm选项 -XX:+HeapDumpOnOutOfMemoryError -Xms30M -Xmx30M

-XX:+HeapDumpOnOutOfMemoryError 表示当出现内存溢出异常时生成dump文件。该文件可用于快速的定位问题,你可以用jdk自带的Java VisualVM来打开该文件。Java VisualVM(jvisualvm.exe)在你的jdk bin的目录下。生成的dump文件(以hprof为后缀)就放在项目的根目录下。打开后可以选中classes tag 就能看到项目中类实例的个数和大小,以上面代码为例,可以看到下图

Demo类创建了1215488个实例,然后我们进一步定位在哪创建这么多实例的代码就很方便了。

-Xms30M 当前进程中堆的最小值30M

Xmx30M 当前进程中堆的最大值也是30M

注意,下面的代码会导致异常吗,如果会,是什么异常?

public class OutOfMem {
  private Integer sum = 0;
  public static void main(String[] args) {
    OutOfMem outOfMem = new OutOfMem();
    while (true){
      outOfMem.sum += 1000000000;
      System.out.println(outOfMem.sum);
    }
  }
}