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