因为虚拟机导致的错误

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

以上参数:

-Xms20m:表示堆的最小值为20M

-Xmx20m:表示堆的最大值同样设置为20M,

-XX:+HeapDumpOnOutOfMemoryError:表示的意思是可以让虚拟机在出现内存溢出异常时Dump(倾倒,倾卸,垃圾场,倒垃圾)出当前内存堆转储快照以便事后进行分析。

 

Debug configuration中配置以上参数,运行一下代码:将出现最下面的异常。

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

当改变上面的数值的参数后,可以改变运行了的次数。

入以下代码:

package com.it;

 

import java.util.ArrayList;

import java.util.List;

 

publicclass HeapOOM {

    staticclass OOMObject{

    }

   

    publicstaticvoid main(String[] args) {

       int i = 0;

       List list = new ArrayList();

       while(++i<1005310){

           list.add(new OOMObject());

           System.out.println(i);

       }

    }

}

出现的异常如下:

1005306

1005307

1005308

java.lang.OutOfMemoryError: Java heap space

Dumping heap to java_pid4568.hprof ...

Heap dump file created [22044099 bytes in 0.464 secs]

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

    at java.util.Arrays.copyOf(Unknown Source)

    at java.util.Arrays.copyOf(Unknown Source)

    at java.util.ArrayList.ensureCapacity(Unknown Source)

    at java.util.ArrayList.add(Unknown Source)

    at com.it.HeapOOM.main(HeapOOM.java:14)

说明:(22044099/1024)/1024 = 21M,比配置过的参数多1M(一般比配置的数值大).此程序片段运行了1005308次,运行时间是0.464秒。出现的异常是堆内存溢出异常。

在运行以上程序片段期间,CPU使用率也将上升,几度为100%。运行之前的截图如下:

运行之后的截图如下:

 

 

 

 

 

你可能感兴趣的:(#,JVM)