java 堆棧

java棧   

java棧用來保存線程的運行狀態。每當啓動一個新線程時,java虛擬機都會爲該線程分配一個java棧,並且棧上的所有數據都是此線程私有的(即任何線程都不能訪問另一個線程的棧數據)。java棧是由許多棧幀(stack frame)或幀(frame)組成的,一個棧幀包含一個java方法的調用。當線程調用一個java方法時,虛擬機壓入一個新的棧幀到該線程的java棧中;而當該方法返回時,這個棧幀被從java棧中彈出並拋棄。

棧幀

棧幀由三部分組成:局部變量區、操作數棧和幀數據區。

局部變量區  包含對應方法的參數和局部變量,它以一個字長爲單位,從0開始計數的數組。類型爲int、float、reference和returnValue的值在數組中只佔據一項,而類型爲boolean、byte、short和char的值在存入數組前都被轉化爲int值因而同樣佔據一項;但是long和double佔據連續的兩項。如:
class Example{
   public static int runClassMethod(int i,long l,float f,double d,Object o,byte b){return 0;}
   public int runInstanceMethod(char c,double d,short s,boolean b){return 0;}
}
操作數棧 與局部變量一樣,也是以一個字長爲單位;但是與前者不同的是,它不是通過索引來訪問,而是通過標準的棧操作(push、pop)來訪問。如:
iload_0 //push the int in local variable 0
iload_1 //push the int in local variable 1
iadd //pop two ints ,add them ,push result
istore_2//pop int ,store into local variable 2

幀數據區  除了局部變量區和操作數外,java棧還需要一些數據來支持常量池的解析、正常方法返回以及異常派發機制,這些信息都保存在幀數據區中。

發佈了24 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章