什么是字节码?
Java bytecode 由单字节(byte)的指令组成,理论上最多支持 256 个操作码(opcode)。 实际上 Java 只使用了200左右的操作码, 还有一些操作码则保留给调试操作。
根据指令的性质,主要分为四个大类:
1. 栈操作指令,包括与局部变量交互的指令 2. 程序流程控制指令
3. 对象操作指令,包括方法调用指令
4. 算术运算以及类型转换指令
生成字节码
假如有一个最简单的类,源代码如下:
编译:
javac demo/jvm/HelloByteCode.java
查看字节码:
javap -c demo.jvm.HelloByteCode
0: aload_0
//把本地表量表(局部方法表)第0个位置上的变量加载到栈上去执行,占用一个字节,a前缀表示引用类型
1: invokespecial #1 // Method java/lang/Object."<init>":()V
注释表示调用了当前父类Object初始化的方法,占用三个字节:1字节操作码,还可跟两个字节操作数,#1表示来自常量池中的常量
4: return
以上均为操作码,当加载到虚拟机,虚拟机会诶个去执行
打印常量池:
javap -c -verbose demo/jvm/HelloByteCode
如需查看本地变量表等信息(debug)
需要在编译的时候执行:
javac -g demo/jvm/HelloByteCode.java