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异常。

更新于:2020年2月6日

940 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告