1 从OutOfMemory说起
发布于 2022年 02月 15日 13:06
最近在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
就能看到项目中类实例的个数和大小,以上面代码为例,可以看到下图
-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);
}
}
}