当堆和堆内存冲突时,程序是否会终止?

时间:2013-09-29 15:02:40

标签: java

在书中阅读以下定义(由M. Reese Richard撰写的 Oracle认证助理,Java ):

“由于堆叠和堆共享相同的内存空间,如果它们发生冲突,则程序将终止。”

是真的吗?

堆栈和堆内存如何“碰撞”?

1 个答案:

答案 0 :(得分:0)

Java程序是多线程的,每个线程都分配了一个单独的堆栈。因此,它们没有向堆增长的单个堆栈,因此Java程序本身不会导致此冲突。

如果线程的堆栈存储在内存的一端,则创建其他线程可能会导致总堆栈空间朝向堆增长。

JVM本身将有一些堆栈空间,它可能会朝向堆空间增长,因此理论上可能会发生冲突。应编写JVM以避免深度(尤其是无限)递归。如果它的堆栈可以向堆增长(而不是有限),它应该检测到该问题并使用VirtualMachineError将其发送给程序。

但是,JVM不允许堆以不受控制的方式增长,但是配置了最大堆空间,并且可以完全控制为线程创建新堆栈。因此它可以完全防止碰撞。唯一可能的冲突是如果不可能创建新的线程堆栈。 JVM将使用VirtualMachineError(可能是OutOfMemoryError)发出该条件的信号。