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()); //新建一个对象是在堆内存中去耗用资源的
        }
    }
}

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_35561207/article/details/84392600