StackOverFlowError与OutOfMemoryError

 

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());
        }
    }

}


 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sinat_36710456

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值