堆溢出条件
要观察堆溢出,要同时满足两个条件:
- 堆大小固定,不可扩展
- 不断创建对象,并保持对象不被回收
因为对象是在堆里面创建的,堆大小一定,一直创建对象就可以消耗完堆空间,同时,由于由于垃圾回收的存在,创建对象的时候也要保证对象不要被当做垃圾回收了,JVM使用可达性分析来判断一个对象是否是垃圾。我们可以使用jvm参数来限制堆大小,可以将对象加入到List中,保持对象存活。
堆溢出代码
package test.jvm;import java.util.ArrayList;
import java.util.List;/**java堆溢出实例* 原理:java的堆是用来存放对象实例的,所以我们只要做到以下三点就可以使堆溢出:* 1、限制堆的大小,不可扩展* 2、不断新建对象* 3、保持对象存活不被回收* 对应的,我们需要:* 1、改变JVM的启动参数,将堆的最小值和最大值设成一样,这样就可以避免堆自动扩展(其实不一样也可以)* 2、不断产生对象* 3、使用一个List来保存对象,保持对象存活* * JVM配置参数: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError* @author luchu**/
public class JVMLearnning01 {static class OOMObject{}public static void main(String[] args){JVMLearnning01 hello = new JVMLearnning01();List<OOMObject> list = new ArrayList<>();while(true){list.add(new OOMObject());}}}
上面的代码要产生堆溢出,要先配置jvm启动参数,run as –> run configration 里可以配置。
上面几个人参数的意思是:
-Xms20m -Xmx20m : 堆的最大最小值都是20m,避免自动扩展。
XX:+HeapDumpOnOutOfMemoryError :让虚拟机在出现堆溢出时dump当前内存堆转储快照,以便进行分析。分析可以使用Eclipse Memory analyzer进行。
学习《深入浅出Java虚拟机》 周志明版 2.4章