一 概述

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.

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐