Java字节码

Java 字节码（英语：Java bytecode）是Java虚拟机执行的一种指令格式。大多数操作码都是一个字节长，而有些操作需要参数，导致了有一些多字节的操作码。而且并不是所有可能的256个操作码都被使用；其中有51个操作码被保留做将来使用。除此之外，原始Java平台开发商，太阳微系统，额外保留了3个代码永久不使用。

与Java的关系

一个Java程序员并不需要理解所有的Java字节码。但是，就像IBM developerWorks周刊建议的那样：“理解字节码以及理解Java编译器如何生成Java字节码与学习汇编知识对于C/C++程序员有一样的意义。”

计算模型

Java字节码的计算模型是面向堆栈结构计算机的。例如，一个x86处理器的汇编代码如下
mov eax, byte [ebp-4]mov edx, byte [ebp-8]add eax, edxmov ecx, eax
这段代码将两个数值相加，并存入另一个地址。相似的反汇编字节码如下
0 iload_11 iload_22 iadd3 istore_3
在这里，需要相加的两个操作数被放入堆栈，而相加操作就在栈中进行，其结果也被放入堆栈。存储指令之后把栈顶的数据放入一个变量地址。在每条指令前面的数字仅仅是表示这条指令到方法开始处的偏移值。这种堆栈结构也可以推广到面向对象模型上。例如，有一个"getName"方法如下
 Method java.lang.String getName()
 0 aload_0       // "this"对象被存入变量0
 1 getfield #5 <Field java.lang.String name>
                 // 这个指令从栈顶取出一个对象，并从中搜索一个指定的域
                 // 并将相应的数据存入栈顶。
                 // 这个例子中，"name"域对应于该类中的第五个常量。
 
 4 areturn   // 返回栈顶的对象作为函数的返回值

例子

考虑如下Java代码
  outer:
  for (int i = 2; i < 1000; i++) {
      for (int j = 2; j < i; j++) {
          if (i % j == 0)
              continue outer;
      }
      System.out.println (i);
  }
假设上述代码位于一个函数中，Java编译器可能将代码翻译成下述的Java字节码。
  0:   iconst_2
  1:   istore_1
  2:   iload_1
  3:   sipush  1000
  6:   if_icmpge       44
  9:   iconst_2
  10:  istore_2
  11:  iload_2
  12:  iload_1
  13:  if_icmpge       31
  16:  iload_1
  17:  iload_2
  18:  irem
  19:  ifne    25
  22:  goto    38
  25:  iinc    2, 1
  28:  goto    11
  31:  getstatic       #84; //Field java/lang/System.out:Ljava/io/PrintStream;
  34:  iload_1
  35:  invokevirtual   #85; //Method java/io/PrintStream.println:(I)V
  38:  iinc    1, 1
  41:  goto    2
  44:  return

运行

当前已经有很多种Java虚拟机产品，包括了自由软件和商业软件。
如果在Java虚拟机之中执行Java字节码并不理想，则可以使用一些工具例如GNU Compiler for Java将Java代码或Java字节码编译成机器码并由硬件直接运行。
而有一些处理器可以直接运行Java字节码，这种处理器名为Java处理器。

对动态语言的支持

Java虚拟机对动态类型语言提供了一定的支持。但绝大多数的Java虚拟机指令集是基于静态类型语言的。在静态类型机制下，方法调用中的类型分析都是在编译时执行的，而且缺乏一种机制在运行时确定一个类型已经确定相应的方法。
JSR292中，在Java虚拟机层次增加了一种支持动态类型的指令invokedynamic，以支持在动态类型检测中的方法调用。 Da Vinci Machine 则是一种支持这种动态类型调用的虚拟机。 而所有支持JSE 7的Java虚拟机都应支持invokedynamic操作码。