Java 中的 StackOverflowError 和 OutOfMemoryError 有什么区别?

javaobject oriented programmingprogramming更新于 2024/7/27 3:17:00

每当我们运行 Java 程序时,操作系统都会为 JVM 分配一些内存。JVM 将此内存分为两部分。一个是堆栈内存,另一个是堆内存。堆栈用于执行方法,堆用于存储对象。当堆栈已满时,JVM 会抛出 java.lang.StackOverflowError,而当堆已满时,JVM 会抛出 java.lang.OutOfMemoryError。

StackOverflowError

  • 堆栈用于执行方法。对于每个方法调用,都会在堆栈内存中创建一个块
  • 与方法相关的数据(如参数、局部变量或对象引用)都存储在此块中。
  • 当方法完成执行时,此块将连同存储在其中的数据一起从堆栈中删除。
  • 每当我们调用一个方法时,它都必须完成执行并离开堆栈内存。
  • 如果方法停留在堆栈中,则堆栈将已满,JVM 将抛出 java.lang.StackOverflowError。

OutOfMemoryError

  • 我们在 Java 中创建的对象存储在堆内存中。当不再需要这些对象时,必须将它们从内存中删除。
  • 垃圾收集器会从堆内存中删除不需要的对象。
  • 如果我们的对象有活动引用,垃圾收集器不会删除它们。它仅删除那些没有活动引用的对象。
  • 每当我们调用一个方法时,它必须完成执行并离开堆栈内存。
  • 如果堆内存中没有剩余空间容纳新对象,则 JVM 将抛出 java.lang.OutOfMemoryError。

相关文章