阅读一本书(Oracle Certified Associate, Java by M. Reese Richard)中的以下定义:
“由于堆栈和堆共享相同的内存空间,如果它们发生冲突,那么程序将终止。”
这是真的吗?
堆栈和堆内存如何“碰撞”?
阅读一本书(Oracle Certified Associate, Java by M. Reese Richard)中的以下定义:
“由于堆栈和堆共享相同的内存空间,如果它们发生冲突,那么程序将终止。”
这是真的吗?
堆栈和堆内存如何“碰撞”?
Java 程序是多线程的,每个线程分配一个单独的堆栈。因此,它们没有向堆增长的单个堆栈,因此 Java 程序本身不会导致这种冲突。
如果线程的堆栈存储在内存的一端,那么创建额外的线程可能会导致总堆栈空间向堆增长。
JVM 本身会有一些堆栈空间,这可能会向堆空间增长,因此理论上可能会发生冲突。应该编写 JVM 以避免深度(尤其是无限)递归。如果它的堆栈可以向堆增长(而不是有限),它应该检测到该问题并使用 VirtualMachineError 向程序发出信号。
但是,JVM 不允许堆以不受控制的方式增长,而是配置了最大堆空间,并且可以完全控制为线程创建新堆栈。因此,它可以完全防止碰撞。唯一潜在的冲突是不可能创建新的线程堆栈。JVM 将使用 VirtualMachineError(可能是 OutOfMemoryError)发出该条件的信号。