对JVM内幕有一些概念之后,我们可以看一下从示例代码生成的一些基本的字节码示例。一个Java类文件中的每个方法都有一个由一系列指令组成的代码片段,每个指令都有如下的格式:
操作符(1个字节) 操作数1(可选) 操作数2(可选)......
这是一条指令,由一个字节的操作符和零个或者多个操作数组成,操作数包含了要进行运算的数据。
在当前执行方法的栈帧中,一条指令可以在操作数栈上进行push或者pop操作,并且它可能在局部变量数组中加载或者保存数值。让我们来看一下简单的例子:
为了打印出编译好的类中的字节码(假定它的文件名是Test.class),我们可以运行javap工具:
javap -v Test.class
我们会得到如下的结果:
为了打印出编译好的类中的字节码(假定它的文件名是Test.class),我们可以运行javap工具:
javap -v Test.class
我们会得到如下的结果:
istore_1: 最上面的操作数出栈(一个int值),并把它保存在序号为1的局部变量中,它对应于变量a
iconst_2: 把整型常量2入栈。
istore_2: 最上面的int操作数出栈,并把它保存在序号为2的局部变量中,它对应于变量b
iload_1: 从序号1的局部变量中加载int值,并把它压入栈顶。
iload_2:从序号2的局部变量中加载int值,并把它压入栈顶
iadd: 从操作数栈中取出两个int值,求和,并把结果放回栈顶
istore_3: 从操作数栈顶取出int值,并把它保存在序号为3的局部变量中,也就是变量c
return: 从void方法返回。
以上的每一个指令都仅由一个操作符组成,它指定了需要JVM执行的确切操作。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。