亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JVM中的Stack和Frame怎么用

發布時間:2022-01-05 17:14:48 來源:億速云 閱讀:110 作者:iii 欄目:云計算

這篇文章主要講解了“JVM中的Stack和Frame怎么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JVM中的Stack和Frame怎么用”吧!

JVM執行Java程序時需要裝載各種數據,比如類型信息(Class)、類型實例(Instance)、常量數據(Constant)、本地變量等。不同的數據存放在不同的內存區中,這些數據內存區稱作“運行時數據區(Runtime Data Area)”。運行時數據區有這樣幾個重要區:JVM Stack(簡稱Stack或者虛擬機棧、線程棧、棧等),Frame(又稱StackFrame/棧幀、方法棧等),Heap(堆/GC堆,即垃圾收集的對象所在區)。下面簡單介紹一下Stack和Frame,對于Heap,請參考垃圾收集相關文章。

概覽

單個線程內共享的區:PC Register/JVM Stack/Native Method Stack。
所有線程共享的區:Heap/Method Area/Runtime Constant Pool。

JVM中的Stack和Frame怎么用

上圖:運行時數據區。重點是每個線程擁有的PCRegister/Stack以及線程共享的Heap以及常量池(ConstantPool)

 

上圖:線程棧(VM Statck/Stack)包含的棧幀(Frame)。重點是棧幀和它的結構,操作棧(OperandStack)以及常量池引用。

Stack

結構:{JVM Stack [Frame][Frame][Frame]... }。
JVM Stack在每個線程被創建時被創建,用來存放一組棧幀(StackFrame/Frame)。
JVM Statck的大小可以是固定的,也可以是動態擴展的。如果線程需要一個比固定大小大的Stack,會發生StackOverflowError;如果動態擴展Stack時沒有足夠的內存或者系統沒有足夠的內存為新線程創建Stack,發生OutOfMemoryError。

Frame

結構:{Frame [ReturnValue] [LocalVariables[][][][]...] [OperandStack [][][]...] [ConstPoolRef] }
每次方法調用均會創建一個對應的Frame,方法執行完畢或者異常終止,Frame被銷毀。一個方法A調用另一個方法B時,A的frame停止,新的frame被創建賦予B,執行完畢后,把計算結果傳遞給A,A繼續執行。

局部變量表
局部變量表的大小在編譯期就被確定。基元類型數據以及引用和返回地址(returnAddress)占用一個局部變量大小,long/double需要兩個。

Java代碼“int a=0;int b=1;int c=2;”對應的局部變量表如下:

LocalVariableTable:
Start Length Slot Name Signature
2 12 0 a I
4 10 1 b I
6 8 2 c I

Start: 變量偏移量。
Length: 作用域范圍長度。[Start,Start+Length)就是該變量的作用域。
Slot: 一個Slot能存儲32bit的數據類型、引用、返回地址,long/dobule需要兩個Slot。


操作棧(OperandStack)
Frame被創建時,操作棧是空的。操作棧的每個項可以存放JVM的各種類型數據,包括long/double。
操作棧有個棧深,long/double貢獻兩個棧深。
操作棧調用其它有返回結果的方法時,會把結果push到棧上。

Java代碼:

int a=1;
int b=2;
int c=a+b;

對應的指令:

0: iconst_1 // push 1到操作棧。大于5的int值會用到 bipush <i> 指令。
1: istore_0 // pop 頂元素,存儲到index=0的本地變量。
2: iconst_2 // push 2 到操作棧
3: istore_1 // pop棧頂元素,存儲到index=1的本地變量。
4: iload_0  // 把index=0的本地變量加載到棧頂
5: iload_1  // 把index=1的本地變量加載到棧頂
6: iadd     // 把棧頂兩個數pop出來相加,并把結果存放到棧頂
7: istore_2 // 結果存儲到index=2的本地變量

感謝各位的閱讀,以上就是“JVM中的Stack和Frame怎么用”的內容了,經過本文的學習后,相信大家對JVM中的Stack和Frame怎么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

固始县| 新昌县| 靖西县| 莱州市| 新巴尔虎右旗| 泽普县| 武邑县| 滁州市| 双鸭山市| 芜湖市| 宁武县| 海伦市| 庆阳市| 东平县| 闻喜县| 时尚| 措勤县| 扎赉特旗| 五莲县| 囊谦县| 武川县| 旌德县| 驻马店市| 桑植县| 广汉市| 花莲县| 图们市| 白银市| 芜湖县| 开封市| 银川市| 汝南县| 会昌县| 黑河市| 克什克腾旗| 闵行区| 抚松县| 合山市| 鸡泽县| 横峰县| 正安县|