字节码
意义
字节码存在的意义就是解决Java跨平台问题,一次编写,到处执行。在不同的操作系统、不同硬件平台上,均可以不同修改代码即可顺畅地执行。作为Java与操作系统的中间码,成功解耦了语言对平台的依赖性。
什么是字节码
Java所有的指令有200个左右,一个字节(8位)可以存储256中不同的指令信息,一个这样的字节称为字节码。在执行过程中,JVM将字节码解释执行,屏蔽对底层操作系统的依赖,JVM也可以将字节码编译执行,如果是热点代码。会通过JIT动态地编译为机器码,提高执行效率。
字节码主要指令
1、加载或存储指令
在某个栈帧中,通过指令操作数据在虚拟机栈的局部变量表和操作栈之间来回传输。
(1)将局部变量加载到操作栈中,ILOAD
(将int类型的局部变量压入栈)和ALOAD
(将对象引用的局部变量压入栈);
(2)从操作栈定存储到局部变量表,如ISTORE
、ASTORE
等;
(3)将常量加载到操作栈顶,ICONST
,BIPUSH
,SIPUSH
、LDC
等;
2、运算指令
对两个操作栈帧上的值进行运算,并把结果写入操作栈顶;
3、类型转换指令
显式转换两种不同的数值类型;
4、对象创建于访问指令
(1)创建对象指令,NEW
、NEWARRAY
;
(2)访问属性指令;
(3)检查实例类型指令;
5、操作栈管理命令
(1)出栈操作;
(2)赋值栈顶元素并压入栈;
6、方法调用与返回指令
(1)INVOKEVIRTUAL
指令:调用对象的实例方法;
(2)INVOKESPECIAL
指令:调用实例初始化方法、私有方法、父类方法;
(3)INVOKESTATIC
指令:调用类静态方法;
(4)RETURN
指令:返回VIOD类型;
源码转为字节码的过程
- 词法解析:通过空格分隔出单词、操作符、控制符等信息,将其形成token信息流,传递给语法解析器;
- 语法解析:在语法解析时,把词法解析得到的token信息流按照Java语法规则组装成一课语法树,
- 语法分析:在这个阶段需要检查关键字的使用是否合理、类型是否匹配、作用域是否正确等;
- 生成字节码;
执行方式
字节码必须通过类加载过程加载到JVM环境后才可以执行,执行有三种模式:
- 解释执行;
- JIT编译执行;
- JIT编译和解释混合执行。
混合执行
解释器在启动时先解释执行,省去编译时间,随着时间推进,JVM通过热点代码统计分析,识别出高频的方法调用、循环体、公共模块等,基于强大的JIT动态编译技术,将特典代码转换很久起码,直接交给CPU执行。