1.JVM之内存溢出之------堆内存溢出

1.首先介绍一下,java堆内存溢出测试:

如下图所示:

往list数组中添加一个静态类的实例化对象不断的区重新建设

如new OOMobject()

使用JMj监控工具可以得知:

其实有交叉的地方出现了周期性的溢出:

输出的具体代码如下所示:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3210)
    at java.util.Arrays.copyOf(Arrays.java:3181)
    at java.util.ArrayList.grow(ArrayList.java:265)
    at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
    at java.util.ArrayList.add(ArrayList.java:462)
    at HeapOOM.main(HeapOOM.java:15)

Process finished with exit code 1

其中:

思路如下所示:

java的堆是用来存储对象实例的,只要不断的去创建新的对象,那么也就会不断的往内存的对内存中不断的去写入新的东西

并且保证gc roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量达到最大堆的容量的时候就会产生内存溢出的情况:

将-Xms参数与最大值-Xmx参数设置为一样既可以避免堆自动扩展,

通过设置参数-XX:+HeapDumponoutofmemoryError可以让虚拟机在出现内存溢出异常时dump出当前内存的快照以便事后进行分析。

其中详细验证代码如下:


/**
 *
 * java 堆内存溢出异常测试
 */

public class HeapOOM {
    static class OOMobject{
    }
    public static void main(String[] args){
        List<OOMobject> list=new ArrayList<OOMobject>();
        while(true){
            ((ArrayList) list).add(new OOMobject()); //新建一个对象是在堆内存中去耗用资源的
        }
    }
}

具体的内存切换如下所示:

直到将不可扩展的内存撑爆为止:

此时已经开始出现了堆内存溢出了:

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值