2014-11-04 38 views
6

JVM規範(JSE 8版)中提到:在JVM堆分配或棧分配框架?

第12頁:2.5.2 JVM棧: 「因爲JVM堆從不直接操縱除了壓入和彈出的幀,幀可以是堆分配」 「框架: 」從創建框架的線程的JVM堆棧中分配框架。「 並在第16頁: 「請注意,線程創建的框架是該線程本地的,並且不能被任何其他線程引用。」

這聽起來讓我感到困惑。由於幀是創建幀的線程本地的,爲什麼在堆中分配幀,因爲堆是在所有JVM線程之間共享的?除非在這裏遺漏某些東西,否則沒有任何意義。第12頁的句子是一個有趣的陳述。

任何提示?謝謝。

+0

「可能堆分配」,我的猜測是,可能存在,因爲它依賴於實現並且沒有JVM規範的固有限制。 JVM實現者可以按照他們想要的方式自由地實現堆棧。 – kosa 2014-11-04 18:14:09

回答

3

JVM堆棧是一種抽象。它可能被分配到任何地方或任何地方。例如。如果一個方法被JIT內聯,它沒有單獨的堆棧框架。

熱點JVM使用本地線程堆棧作爲JVM堆棧。但是,有一些JVM實現(例如CLDC HI)可以在Java Heap中分配JVM堆棧。這種方法的好處是對包括線程堆棧在內的所有東西都擁有單一的內存管理。這樣的JVM可以在沒有標準內存管理器(如libc)或甚至沒有OS的平臺上運行。

JVM堆也是一個抽象。 JVM線程之間的「共享」不比本地線程堆棧更「共享」。堆可能也有線程局部區域。同時,本地線程堆棧駐留在虛擬內存中,該虛擬內存也在進程的所有線程之間共享。

+0

好的背景介紹,但沒有直接提示這個問題的答案呢... – 2014-11-13 02:07:47

+0

@ user1139247爲什麼不呢? *「在JVM堆中分配幀還是堆棧分配?」 - 我已經告訴過這兩種JVM實現。最流行的HotSpot JVM使用本地堆棧。 *爲什麼要在堆中分配幀,因爲堆在所有JVM線程之間共享?* - 我也告訴過這種方法的好處。 – apangin 2014-11-13 15:30:22