您的当前位置:首页正文

StackOverFlowError与OutOfMemoryError

2024-11-10 来源:个人技术集锦

 

1.StackOverFlowError

前面说到,当一个线程启动的时候,jvm就会给这个线程分配一个栈,随着程序的执行,会不断执行方法,每当调用一个方法的时候,jvm就会往这个栈压入一个栈帧,方法调用完毕,栈帧出栈,因此栈帧会不断入栈和出栈。然后,一个栈所能容纳的栈帧是有限的,当栈帧的数量超过了栈所允许的范围的时候(比如递归调用),就会抛出StackOverFlowError异常。

【注意】:一个栈能容纳的栈帧是固定的,有默认的值,当然你也可以通过-Xss去调。但这个栈里面的引用所指向堆内存空间是可以扩展的。简而言之,一个栈的栈帧数目是确定的,而与该栈相关联的堆内存是可以动态扩展的,这些是前提。

演示代码如下:

public class Test {
 
    public static void main(String[] args) {
        Test test = new Test();
        test.recursionFun();
    }
    
    /**
     * 递归方法
     */
    public void recursionFun() {
        recursionFun();
    }

}


2.OutOfMemoryError

程序在执行的过程中,需要不断的在堆内存new对象,每new一个对象,就会占用一段内存,当对没有足够的内容分配给对象示例时,就会抛出OutOfMemoryError异常。

演示代码如下:

public class Test {

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

}


 
 

显示全文