1

对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执行的确切操作。


java架构学习之路
19 声望0 粉丝