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