JVM堆溢出实例

来源:互联网 发布:岩泉一数据 编辑:程序博客网 时间:2024/05/16 01:50

堆溢出条件

要观察堆溢出,要同时满足两个条件:

  1. 堆大小固定,不可扩展
  2. 不断创建对象,并保持对象不被回收

因为对象是在堆里面创建的,堆大小一定,一直创建对象就可以消耗完堆空间,同时,由于由于垃圾回收的存在,创建对象的时候也要保证对象不要被当做垃圾回收了,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章

0 0
原创粉丝点击