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