標籤:
java棧和函數調用的關係圖
【名詞解釋】
--->java棧是一塊線程的私人空間
--->java的棧是先進後出的資料結構。函數返回,則該函數的棧幀被彈出。
--->一個函數對應一個棧幀,一個棧幀裡包含局部變數表,運算元棧,棧資料區
【行為解釋】
--->每次函數調用都會產生相應的棧幀,從而佔用一定的棧空間,因為棧空間不足,那麼函數調用自然無法繼續進行下去。當請求的棧深度大於最大可用深度時,系統會拋出StackOverflowError的棧溢出錯誤
【異常】
--->棧記憶體溢出java.lang.StackOverflowError
【參數設定】
--->-Xss128k 代表線程的最大棧空間為128K
【棧幀包含的內容解釋】
《局部變數表》
--->儲存所指函數的局部變數,參數。函數局部變數和參數越多則棧幀越大,所佔棧空間越多,影響函數的嵌套調用次數。
--->long和double類型的局部變數佔用2個字大小。
--->int,short,byte,對象引用等佔用1個字大小
--->字:電腦記憶體中佔據一個單獨記憶體單元編號的一組二進位串。一般32位電腦上一個字為4個位元組的長度
--->每個局部變數表中有:範圍範圍,所在槽位(索引,變數名,資料類型)後邊變數槽位可複用前邊已經失去範圍變數的槽位,達到節省空間的目的。
/**
*
* @param a
* @param b
* 局部變零表中:this ,a,b,c,d
* 槽位:this(0),a(1),b(2),c(3),d(4)
* 所站字的大小為:5個字
*
*/
public static void test1(String a,int b){
int c=0;
System.out.println("Test2.test1()"+c);
long d=2;
}
/**
*
* @param a
* @param b
* 局部變零表中:this ,a,b,c,d
* 槽位:this(0),a(1),b(2),c(3),d(3)
* 所站字的大小為:4個字
*/
public static void test2(String a,int b){
if(true){
int c=0;
System.out.println("Test2.test2()"+c);
}
int d=2;
}
《運算元棧》
--->運算元棧也是棧幀中重要的內容之一,主要儲存計算過程的中間結果,同時作為計算過程中變數臨時儲存空間
--->先進後出的資料結構
《幀資料區》
--->訪問常量池的指標,方便程式訪問常量池
--->異常處理表。當程式發生異常,根據該表尋找相應的異常,進行處理
棧上分配:
--->是java虛擬機器提供的一項最佳化技術,基本思想:對於那些線程私人的對象(這裡指不可能被其他線程訪問的對象),可以將他們打散分配在棧上,而不是分配在堆上。分配在棧上的好處是可以在函數調用結束後自行銷毀,而不需要記憶體回收行程介入,從而提高系統效能。
--->棧上分配的一個技術基礎是進行逃逸分析。逃逸分析的目的是判斷對象的範圍是否有可能逃逸出函數體。
(3)java棧