JVM基于栈的解释器执行原理
生活随笔
收集整理的這篇文章主要介紹了
JVM基于栈的解释器执行原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
繼上一篇字節碼分析finally塊對return返回值的影響,好多人對局部變量表和操作數棧之間的關系搞不清楚,下面通過圖解來描述局部變量表和操作數棧直接的關系。
通過下面這段代碼來解釋JVM基于棧的執行原理
4. public static int add(int a, int b) { 5. int c = 0; 6. c = a + b; 7. return c; 8. }查看字節碼的命令:javap -verbose ByteCode.class
add方法的字節碼如下:
public static int add(int, int);descriptor: (II)I //描述方法參數為兩個int類型的變量和方法的返回類型是int的flags: ACC_PUBLIC, ACC_STATIC //修飾方法public和staticCode:stack=2, locals=3, args_size=2 //操作數棧深度為2,本地變量表容量為3,參數個數為20: iconst_0 //將int值0壓棧1: istore_2 //將int值0出棧,存儲到第三個局部變量(slot)中2: iload_0 //將局部變量表中第一個變量10壓棧3: iload_1 //將局部變量表中第一個變量20壓棧4: iadd //將操作數棧頂兩個int數彈出,相加后再壓入棧中5: istore_2 //將棧頂的int數(30)彈出,存儲到第三個局部變量(slot)中6: iload_2 //將局部變量表中第三個變量壓棧7: ireturn //返回棧中數字30LineNumberTable:line 5: 0 //代碼第5行對應字節碼第0行line 6: 2 //代碼第6行對應字節碼第2行line 7: 6 //代碼第7行對應字節碼第6行LocalVariableTable:Start Length Slot Name Si0 8 0 a I //a占用第1個solt0 8 1 b I //b占用第2個solt2 6 2 c I //c占用第3個solt根據上面字節碼畫出下面局部變量表和操作數棧之間的操作關系。
圖中調用add(10,20)傳入的參數是a=10;b=20。
0: iconst_0 //將int值0壓棧
1: istore_2 //將int值0出棧,存儲到第三個局部變量(slot)中
2: iload_0 //將局部變量表中第一個變量10壓棧
3: iload_1 //將局部變量表中第一個變量20壓棧
4: iadd //將操作數棧頂兩個int數彈出10和20,相加后再壓入棧中
5: istore_2 //將棧頂的int數(30)彈出,存儲到第三個局部變量(slot)中
6: iload_2 //將局部變量表中第三個變量壓棧
7: ireturn //返回棧中數字30
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
總結
以上是生活随笔為你收集整理的JVM基于栈的解释器执行原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字节码分析finally块对return
- 下一篇: 并发编程基础知识点