递归方法是如何引起java.lang.StackOverflowError异常的的?

26 篇文章 0 订阅

一 概述

Java8源码中有以下一句话,意思为由于应用程序递归太深而导致堆栈溢出。

/**
 * Thrown when a stack overflow occurs because an application
 * recurses too deeply.
 * 由于应用程序递归太深而在堆栈溢出时抛出
 * @author unascribed
 * @since   JDK1.0
 */

二 递归造成堆栈溢出的原因

当一个线程执行一个方法时,就会随之创建一个栈帧,并将该栈帧压入虚拟机栈中,当方法执行结束之后对应的栈帧就会出栈。一般当前执行的方法的栈帧位于虚拟机栈的栈顶,而递归方法每次调用本身就会创建一个栈帧,同时保存当前方法的栈帧中状态,并将其放入虚拟机方法栈之中。每个线程在虚拟机中的方法栈深度是固定的,随着递归方法的运行方法的栈帧不断被放入虚拟机栈中,如果放入虚拟机栈中的栈帧数超过了该线程的方法栈深度就会出现常见的错误提示——java.lang.StackOverflowError。

三 解决java.lang.StackOverflowError的一些策略

在编程过程中,递归是一种比较好的方法使用策略,当时为了避免上述问题,我们应该避免使用很深度的递归,或者使用循环对递归方法进行替换。

补充:如果虚拟机栈可以动态扩展时,如果无法申请到过多的内存空间,一定情况下会出现java.lang.OutOfMemoryError.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值