2011-03-26 103 views
4

我知道JVM爲每個線程創建一個堆棧,並且該堆棧在線程調用它們時包含對其他方法的調用。我不明白什麼時候它說棧也會有局部變量和部分結果。我認爲全局變量和局部變量(原語和參考)將存在於堆中,而不是堆棧中,請有人詳細說明它的含義。其次它說部分結果,是否意味着當線程切換髮生時,這些半執行結果(副本)從本地和實例變量?JVM堆棧變量

由於

-Abidi

+0

你爲什麼不選擇合適的答案? – 2015-05-03 09:13:19

回答

5

每個JVM有方法調用幀的運行時間堆棧。每個方法框架包含

  • 對包含該方法的Java類的引用。
  • 用於保存臨時值的操作數堆棧。
  • 用於保存函數參數和臨時結果的「局部變量」數組。

這個局部變量數組的存在使得當第一次調用該函數時,該函數的參數可以存儲在某處。局部變量數組實際上並不包含Java源代碼中聲明的所有局部變量;相反,它更像是一個臨時緩衝區,用於保存對堆中其他地方聲明的Java對象的引用,或者保存足夠多的引用時間的值,以便將它們放在運行時堆棧上的速度會很慢或效率低下。

總之,你是正確的,當地人和全局變量都存儲在堆中。 Java線程中的「局部變量」數組與這些局部變量不相對應,而是在解釋該方法的字節碼時臨時使用該線程所使用的空間。

+1

+1,但我會替換「存儲全局變量」和「存儲全局變量的引用」,因爲堆棧只包含引用或原始值。 – Ingo 2011-03-27 09:44:44

0

每個JVM都有一個方法調用框架的運行時棧。每個方法幀包含

A reference to the Java class containing that method. 
An operand stack for holding temporary values. 
A "local variables" array for holding function arguments and temporary results. 

存在這種局部變量數組,使得當第一次調用的函數,自變量,以該功能可以存儲在某個地方。局部變量數組實際上並不包含Java源代碼中聲明的所有局部變量;相反,它更像是一個臨時緩衝區,用於保存對堆中其他地方聲明的Java對象的引用,或者保存足夠多的引用時間的值,以便將它們放在運行時堆棧上的速度會很慢或效率低下。

總之,你是正確的,當地人和全局變量都存儲在堆中。 Java線程中的「局部變量」數組與這些局部變量不相對應,而是在解釋該方法的字節碼時臨時使用該線程所使用的空間。