zoukankan      html  css  js  c++  java
  • JVM基于栈的解释器执行原理

    通过下面这段代码来解释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和static
       Code:
         stack=2, locals=3, args_size=2     //操作数栈深度为2,本地变量表容量为3,参数个数为2
            0: 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     //返回栈中数字30
         LineNumberTable:
           line 5: 0       //代码第5行对应字节码第0行
           line 6: 2       //代码第6行对应字节码第2行
           line 7: 6       //代码第7行对应字节码第6行
         LocalVariableTable:
           Start  Length  Slot  Name   Si
               0       8     0     a   I    //a占用第1个solt
               0       8     1     b   I    //b占用第2个solt
               2       6     2     c   I    //c占用第3个solt
     

    根据上面字节码画出下面局部变量表和操作数栈之间的操作关系。


     
    局部变量表和操作数栈关系

    图中调用add(10,20)传入的参数是a=10;b=20。

    1. 指令0执行后:局部变量表中有两个数字10、和20,操作数栈一个值0,程序计数器指向第0行字节码指令
      0: iconst_0 //将int值0压栈
    2. 指令1执行后:局部变量表中有三个数字10、20和0,操作数栈没有值,程序计数器指向第1行字节码指令
      1: istore_2 //将int值0出栈,存储到第三个局部变量(slot)中
    3. 指令2执行后:局部变量表中有三个数字10、20和0,操作数栈一个值10,程序计数器指向第2行字节码指令
      2: iload_0 //将局部变量表中第一个变量10压栈
    4. 指令3执行后:局部变量表中有三个数字10、20和0,操作数栈两个值10和20,程序计数器指向第3行字节码指令
      3: iload_1 //将局部变量表中第一个变量20压栈
    5. 指令4执行后:局部变量表中有三个数字10、20和0,操作数栈一个值30,程序计数器指向第4行字节码指令
      4: iadd //将操作数栈顶两个int数弹出10和20,相加后再压入栈中
    6. 指令5执行后:局部变量表中有三个数字10、20和30,操作数栈没有值,程序计数器指向第5行字节码指令
      5: istore_2 //将栈顶的int数(30)弹出,存储到第三个局部变量(slot)中
    7. 指令6执行后:局部变量表中有三个数字10、20和30,操作数栈一个值30,程序计数器指向第6行字节码指令
      6: iload_2 //将局部变量表中第三个变量压栈
    8. 指令7执行后:将栈中的数字返回给调用方法,并销毁此栈帧
      7: ireturn //返回栈中数字30
  • 相关阅读:
    古谚、评论与论断、名篇与名言
    重读《西游记》
    重读《西游记》
    命名之法 —— 时间、季节、地点
    命名之法 —— 时间、季节、地点
    文言的理解 —— 古时的称谓、别称、别名
    文言的理解 —— 古时的称谓、别称、别名
    Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration
    瀑布 敏捷 文档
    POJ 1325 ZOJ 1364 最小覆盖点集
  • 原文地址:https://www.cnblogs.com/qq610039525/p/12673853.html
Copyright © 2011-2022 走看看