java.lang.StackOverflowError :当应用程序递归太深而发生堆栈溢出时,抛出该错误。从以下版本开始:JDK1.0 .
StackOverflowError是由于当前线程的栈满了 ,也就是函数调用层级过多导致。
由于深度递归,抛出此错误以指示应用程序的堆栈已耗尽。
在StackOverflowError
扩展VirtualMachineError
级,这表明JVM坏了,或者它已经耗尽资源而无法操作。此外,这个类VirtualMachineError
扩展了这个Error
类,它用来表示应用程序不应该捕获的严重问题。一个方法不能在其throw
子句中声明这样的错误,因为这些错误是永远不会发生的异常情况。
Java中的StackOverflowError
当Java应用程序调用函数调用时,会在调用堆栈上分配一个堆栈帧。堆栈帧包含被调用方法的参数,其本地参数和方法的返回地址。返回地址表示执行点,在调用方法返回后,程序执行应继续执行。如果没有空间用于新的堆栈帧,StackOverflowError
则由Java虚拟机(JVM)抛出。
可能会耗尽Java应用程序堆栈的最常见情况是递归。在递归中,一个方法在执行期间调用自己。递归被认为是一种强大的通用编程技术,但必须谨慎使用,StackOverflowError
以避免这种情况。
处理StackOverflowError
- 最简单的解决方案是仔细检查堆栈轨迹并检测行号的重复模式。这些行号表示递归调用的代码。一旦你检测到这些行,你必须仔细检查你的代码,并理解为什么递归永远不会终止。
- 如果你已验证递归正确实施,则可以增加堆栈的大小,以便允许大量的调用。根据安装的Java虚拟机(JVM),默认线程堆栈大小可能等于或者
512KB
或1MB
。可以使用-Xss
标志增加线程堆栈大小。该标志可以通过项目的配置或通过命令行指定(更多详情可以百度)。-Xss
参数的格式是:-Xss<size>[g|G|m|M|k|K]