JVM-----OutOfMemoryError异常

1、程序计数器是唯一一个不会发生oom情况的区域,其他几个区域都有可能发生oom异常。

2、虚拟机栈和本地方法栈溢出

如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。

如果虚拟机在扩展栈时无法申请到足够的内存空间,将抛出OutOfMemoryError异常。u

3、java堆溢出

如果堆中没有内存完成对象实例分配,并且堆也无法再扩展,则会抛出oom。

测试代码:

/**

(初始堆大小) (最大堆大小)  (年轻代大小)

-Xms20M       -Xmx20M            -Xmn10M

将-Xms20M       -Xmx20M   设置为一样的,即限制了堆不可以扩容。

当堆上没有足够的空间分配对象,又不能扩容时,就抛出OutOfMemoryError

**/

import java.util.ArrayList;
import java.util.List;
public class OutOfMemoryTest {
static class OOMObject{

}

public static void main(String[] args){
List<OOMObject> list = new ArrayList<OOMObject>();
while(true){
list.add(new OOMObject());
}
}

}

4、方法区和运行时常量池溢出

运行时常量池是方法区的一部分。

(1)运行时常量池溢出

例如,不断的向常量池中添加String字符串,就会导致运行时常量池溢出,抛出oom。

(2)方法区溢出

运行时,产生大量的类去填满方法区,直至溢出,抛出oom异常。

5、本机直接内存溢出

直接内存不是运行时数据区域的一部分,运行时数据区域只包含常说的那5部分。



猜你喜欢

转载自blog.csdn.net/g1607058603/article/details/80556058