2013-09-29 47 views
0

閱讀一本書下面的定義(Oracle認證助理,爪哇由M.里斯理查德。):當堆棧和堆棧內存發生衝突時,程序是否終止?

「作爲棧和堆共享相同的內存空間,如果發生碰撞,則程序將終止。 「

這是真的嗎?

堆棧和堆內存如何「碰撞」?

+6

切換到更好的書。 – SLaks

+2

曾聽說過[Stack overflow](http://en.wikipedia.org/wiki/Stack_overflow)? – nosid

+2

這是哪本書? – Joni

回答

0

Java程序是多線程的,每個線程分配一個單獨的堆棧。因此,他們沒有一個單一堆棧向堆中增長,所以Java程序本身不會導致這種衝突。

如果線程堆棧存儲在內存的一端,創建其他線程可能會導致堆棧空間總量向堆增長。

JVM本身會有一些堆棧空間,它可能會向堆空間增長,理論上可能會發生衝突。應該編寫JVM以避免深度遞歸(尤其是無限遞歸)。如果堆棧可能朝堆棧方向發展(而不是有限的),它應該檢測到該問題並使用VirtualMachineError向程序發出信號。

但是,JVM不允許堆以不受控制的方式增長,但配置了最大堆空間,並且完全控制爲線程創建新堆棧。因此它可以完全防止碰撞。如果不可能創建新的線程堆棧,唯一的潛在衝突就是。 JVM會使用VirtualMachineError(可能是OutOfMemoryError)指示該情況。