卷前:用了这么久的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 将操作数栈顶的整形值返回给方法调用者或者结束