JVM中的Stack和Frame怎么用

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

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個(gè)不僅審美在線,而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對(duì)網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無止境。

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

概覽

單個(gè)線程內(nèi)共享的區(qū):PC Register/JVM Stack/Native Method Stack。
所有線程共享的區(qū):Heap/Method Area/Runtime Constant Pool。

JVM中的Stack和Frame怎么用

上圖:運(yùn)行時(shí)數(shù)據(jù)區(qū)。重點(diǎn)是每個(gè)線程擁有的PCRegister/Stack以及線程共享的Heap以及常量池(ConstantPool)

 

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

Stack

結(jié)構(gòu):{JVM Stack [Frame][Frame][Frame]... }。
JVM Stack在每個(gè)線程被創(chuàng)建時(shí)被創(chuàng)建,用來存放一組棧幀(StackFrame/Frame)。
JVM Statck的大小可以是固定的,也可以是動(dòng)態(tài)擴(kuò)展的。如果線程需要一個(gè)比固定大小大的Stack,會(huì)發(fā)生StackOverflowError;如果動(dòng)態(tài)擴(kuò)展Stack時(shí)沒有足夠的內(nèi)存或者系統(tǒng)沒有足夠的內(nèi)存為新線程創(chuàng)建Stack,發(fā)生OutOfMemoryError。

Frame

結(jié)構(gòu):{Frame [ReturnValue] [LocalVariables[][][][]...] [OperandStack [][][]...] [ConstPoolRef] }
每次方法調(diào)用均會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的Frame,方法執(zhí)行完畢或者異常終止,F(xiàn)rame被銷毀。一個(gè)方法A調(diào)用另一個(gè)方法B時(shí),A的frame停止,新的frame被創(chuàng)建賦予B,執(zhí)行完畢后,把計(jì)算結(jié)果傳遞給A,A繼續(xù)執(zhí)行。

局部變量表
局部變量表的大小在編譯期就被確定?;愋蛿?shù)據(jù)以及引用和返回地址(returnAddress)占用一個(gè)局部變量大小,long/double需要兩個(gè)。

Java代碼“int a=0;int b=1;int c=2;”對(duì)應(yīng)的局部變量表如下:

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: 一個(gè)Slot能存儲(chǔ)32bit的數(shù)據(jù)類型、引用、返回地址,long/dobule需要兩個(gè)Slot。


操作棧(OperandStack)
Frame被創(chuàng)建時(shí),操作棧是空的。操作棧的每個(gè)項(xiàng)可以存放JVM的各種類型數(shù)據(jù),包括long/double。
操作棧有個(gè)棧深,long/double貢獻(xiàn)兩個(gè)棧深。
操作棧調(diào)用其它有返回結(jié)果的方法時(shí),會(huì)把結(jié)果push到棧上。

Java代碼:

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

對(duì)應(yīng)的指令:

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

感謝各位的閱讀,以上就是“JVM中的Stack和Frame怎么用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)JVM中的Stack和Frame怎么用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

當(dāng)前文章:JVM中的Stack和Frame怎么用
URL鏈接:http://muchs.cn/article30/pisdpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)頁設(shè)計(jì)公司域名注冊(cè)、面包屑導(dǎo)航搜索引擎優(yōu)化、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)