JVM探秘6--图解虚拟机栈的局部变量表和操作数栈工作流程

Posted jackion5

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM探秘6--图解虚拟机栈的局部变量表和操作数栈工作流程相关的知识,希望对你有一定的参考价值。

案例代码如下:

 1 public class JVMTest {
 2     public static Integer num = 10;
 3 
 4     public int add(int i){
 5         int j = 5;
 6         int k = i+j;
 7         j++;
 8         k = num + j;
 9         return k;
10     }
11 
12     public static void main(String[] args){
13         System.out.println(new JVMTest().add(4));
14     }
15 }

编译之后主要指令集如下:

 1 {
 2   public static java.lang.Integer num;
 3     descriptor: Ljava/lang/Integer;
 4     flags: ACC_PUBLIC, ACC_STATIC
 5 
 6   public com.lucky.grpc.JVMTest();
 7     descriptor: ()V
 8     flags: ACC_PUBLIC
 9     Code:
10       stack=1, locals=1, args_size=1
11          0: aload_0
12          1: invokespecial #1                  // Method java/lang/Object."<init>":()V
13          4: return
14       LineNumberTable:
15         line 3: 0
16 
17   public int add(int);
18     descriptor: (I)I
19     flags: ACC_PUBLIC
20     Code:
21       stack=2, locals=4, args_size=2
22          0: iconst_5
23          1: istore_2
24          2: iload_1
25          3: iload_2
26          4: iadd
27          5: istore_3
28          6: iinc          2, 1
29          9: getstatic     #2                  // Field num:Ljava/lang/Integer;
30         12: invokevirtual #3                  // Method java/lang/Integer.intValue:()I
31         15: iload_2
32         16: iadd
33         17: istore_3
34         18: iload_3
35         19: ireturn
36       LineNumberTable:
37         line 7: 0
38         line 8: 2
39         line 9: 6
40         line 10: 9
41         line 11: 18
42 
43   public static void main(java.lang.String[]);
44     descriptor: ([Ljava/lang/String;)V
45     flags: ACC_PUBLIC, ACC_STATIC
46     Code:
47       stack=3, locals=1, args_size=1
48          0: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
49          3: new           #5                  // class com/lucky/grpc/JVMTest
50          6: dup
51          7: invokespecial #6                  // Method "<init>":()V
52         10: iconst_4
53         11: invokevirtual #7                  // Method add:(I)I
54         14: invokevirtual #8                  // Method java/io/PrintStream.println:(I)V
55         17: return
56       LineNumberTable:
57         line 15: 0
58         line 16: 17
59 
60   static {};
61     descriptor: ()V
62     flags: ACC_STATIC
63     Code:
64       stack=1, locals=0, args_size=0
65          0: bipush        10
66          2: invokestatic  #9                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
67          5: putstatic     #2                  // Field num:Ljava/lang/Integer;
68          8: return
69       LineNumberTable:
70         line 4: 0
71 }

 

其中第17行到第41行是add方法的指令,接下来就一行一行图解虚拟机栈是如何执行的!

第一步:iconst_5  :将int类型的常量5压入操作数栈

第二步:istore_2 :将操作数栈顶中int类型数据放入局部常量表下标为2的位置,从0开始数也就是第三个位置

第三步:iload_1 :

 

 

 

 

以上是关于JVM探秘6--图解虚拟机栈的局部变量表和操作数栈工作流程的主要内容,如果未能解决你的问题,请参考以下文章

jvm虚拟机栈的作用

11.JDK8内存模型本地方法栈虚拟机栈栈帧结构(局部变量表操作数栈方法出口虚拟机栈与本地方法栈的关系寄存器方法区堆(Heap)jvm中的常量池Metaspace(元空间))

线程与虚拟机栈

一篇文章帮你搞定JVM中的虚拟机栈

JVM 运行时内存空间详解——虚拟机栈

JVM理论:(三/3)运行时栈帧结构基于栈的字节码解释执行过程