JVM堆溢出实例

堆溢出条件

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

  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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值