递归方法是如何引起java.lang.StackOverflowError异常的的?
一 概述Java8源码中有以下一句话,意思为由于应用程序递归太深而导致堆栈溢出。/*** Thrown when a stack overflow occurs because an application* recurses too deeply.* 由于应用程序递归太深而在堆栈溢出时抛出* @author unascribed* @sinceJDK1.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.
更多推荐
已为社区贡献7条内容
所有评论(0)