91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

二连浩特市| 临高县| 察雅县| 义马市| 澳门| 交城县| 连州市| 霸州市| 南丰县| 凯里市| 芮城县| 高雄县| 凉山| 大方县| 方城县| 济宁市| 渝北区| 郓城县| 闵行区| 屏山县| 龙江县| 水富县| 太仆寺旗| 米泉市| 建瓯市| 吴旗县| 高阳县| 正阳县| 庆阳市| 金寨县| 宁津县| 清新县| 凭祥市| 台湾省| 民勤县| 大兴区| 汽车| 呼图壁县| 纳雍县| 江油市| 赣州市|