StackOverflowErrorOutOfMemoryError 都是Java虚拟机在运行时抛出的错误(Error)的子类,表示程序在执行时遇到了一些无法恢复的错误情况。它们分别代表了两种不同的错误类型:

  1. StackOverflowError:

    • 原因: 当一个线程的调用栈(方法调用的嵌套)过深,导致栈帧无法再被压入调用栈时,就会抛出 StackOverflowError
    • 典型场景: 递归调用未正确终止,导致调用栈无限增长。
    public class StackOverflowExample {
        public static void recursiveMethod() {
            recursiveMethod();
        }
    
        public static void main(String[] args) {
            recursiveMethod();
        }
    }
    

    在上述示例中,recursiveMethod 方法无限递归调用,导致调用栈溢出,最终抛出 StackOverflowError

  2. OutOfMemoryError:

    • 原因: 当Java虚拟机无法分配所需的内存空间时,就会抛出 OutOfMemoryError
    • 典型场景: 堆内存溢出、永久代/元空间溢出、栈内存溢出等。
    public class OutOfMemoryExample {
        public static void main(String[] args) {
            List<Object> list = new ArrayList<>();
            while (true) {
                list.add(new Object());
            }
        }
    }
    

    在上述示例中,通过无限向列表中添加对象,最终导致堆内存溢出,抛出 OutOfMemoryError

总的来说,StackOverflowError 主要与调用栈的深度有关,而 OutOfMemoryError 则与内存分配有关,可能发生在堆、永久代/元空间或栈等不同的内存区域。处理这两种错误需要分别关注调用栈深度和内存使用情况。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.