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()); //新建一个对象是在堆内存中去耗用资源的
}
}
}
具体的内存切换如下所示:
直到将不可扩展的内存撑爆为止:
此时已经开始出现了堆内存溢出了: