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

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

StackOverflowError

  • 堆栈用于执行方法。对于每个方法调用,都会在堆栈存储器中创建一个块

  • 与该方法相关的数据(例如参数,局部变量或对对象的引用)存储在此块中。

  • 该方法执行完毕后,将从堆栈中删除此块以及其中存储的数据。

  • 每当我们调用方法时,它都必须完成其执行并离开堆栈内存。

  • 如果方法保留在堆栈中,则堆栈将已满,并且JVM将抛出java.lang.StackOverflowError。

OutOfMemoryError

  • 我们用Java创建的对象存储在堆内存中。当不再需要这些对象时,必须将其从内存中删除。

  • 垃圾收集器从堆内存中删除不需要的对象。

  • 如果我们的对象具有实时引用,则垃圾收集器不会删除它们。它仅删除那些没有实时引用的对象。

  • 每当我们调用方法时,它都必须完成其执行并离开堆栈内存。

  • 如果堆内存中没有剩余空间供新对象使用,则JVM将抛出java.lang.OutOfMemoryError。