卷前:用了这么久的java,了解到的是作为一门高级语言在各种应用层、大数据处理层的卓越表现,越是高级语言,似乎越来越不关注底层实现,但是作为一名合格的developer,对于底层最少JVM原理、内存堆栈还是要知道一点的。

 

代码驱动,首先看一段最开始入门学的整数相加的代码。

public class TestAdd {
    public int testPlus() {
    int a = 100;
    int b = 200;
    return a+b;
    }
}

我们先用javac命令编译一下。

win10下打开cmd,前提java、javac环境变量配置完善。

javac TestAdd.java

编译生成JAVA字节码文件.class

javap JAVA反编译命令对上面编译生成的.class字节码文件进行反编译

javap -c TestAdd.class

下面可以看到反编译后的结果,我们用>>输出到一个txt文本文件。

我们来关注testPlus()这个函数反编译后的结果。

Compiled from "TestAdd.java"
public class TestAdd {
  public TestAdd();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public int testPlus();
    Code:
       0: bipush        100
       2: istore_1
       3: sipush        200
       6: istore_2
       7: iload_1
       8: iload_2
       9: iadd
      10: ireturn
}

bipush 100 将单字节的整数100推送至栈顶

istore_1 将栈顶整数出栈并且保存到局部变量表位置1处

sipush 200 将单字节的short型200推送至栈顶

istore_2 将栈顶整数出栈并且保存到局部变量表位置2处

iload_1 将局部变量表1位置的数据压入操作数栈顶

iload_2 将局部变量表2位置的数据压入操作数栈顶

iadd 将操作数中头两个元素(100、200)出栈,做整形相加,最后结果重新入

ireturn 将操作数栈顶的整形值返回给方法调用者或者结束