StackOverflowError
和 OutOfMemoryError
都是Java虚拟机在运行时抛出的错误(Error)的子类,表示程序在执行时遇到了一些无法恢复的错误情况。它们分别代表了两种不同的错误类型:
-
StackOverflowError:
- 原因: 当一个线程的调用栈(方法调用的嵌套)过深,导致栈帧无法再被压入调用栈时,就会抛出
StackOverflowError
。 - 典型场景: 递归调用未正确终止,导致调用栈无限增长。
public class StackOverflowExample { public static void recursiveMethod() { recursiveMethod(); } public static void main(String[] args) { recursiveMethod(); } }
在上述示例中,
recursiveMethod
方法无限递归调用,导致调用栈溢出,最终抛出StackOverflowError
。 - 原因: 当一个线程的调用栈(方法调用的嵌套)过深,导致栈帧无法再被压入调用栈时,就会抛出
-
OutOfMemoryError:
- 原因: 当Java虚拟机无法分配所需的内存空间时,就会抛出
OutOfMemoryError
。 - 典型场景: 堆内存溢出、永久代/元空间溢出、栈内存溢出等。
public class OutOfMemoryExample { public static void main(String[] args) { List<Object> list = new ArrayList<>(); while (true) { list.add(new Object()); } } }
在上述示例中,通过无限向列表中添加对象,最终导致堆内存溢出,抛出
OutOfMemoryError
。 - 原因: 当Java虚拟机无法分配所需的内存空间时,就会抛出
总的来说,StackOverflowError
主要与调用栈的深度有关,而 OutOfMemoryError
则与内存分配有关,可能发生在堆、永久代/元空间或栈等不同的内存区域。处理这两种错误需要分别关注调用栈深度和内存使用情况。
Was this helpful?
0 / 0