字节码

意义

字节码存在的意义就是解决Java跨平台问题,一次编写,到处执行。在不同的操作系统、不同硬件平台上,均可以不同修改代码即可顺畅地执行。作为Java与操作系统的中间码,成功解耦了语言对平台的依赖性。

什么是字节码

Java所有的指令有200个左右,一个字节(8位)可以存储256中不同的指令信息,一个这样的字节称为字节码。在执行过程中,JVM将字节码解释执行,屏蔽对底层操作系统的依赖,JVM也可以将字节码编译执行,如果是热点代码。会通过JIT动态地编译为机器码,提高执行效率。

字节码主要指令

1、加载或存储指令
在某个栈帧中,通过指令操作数据在虚拟机栈的局部变量表和操作栈之间来回传输。

(1)将局部变量加载到操作栈中,ILOAD(将int类型的局部变量压入栈)和ALOAD(将对象引用的局部变量压入栈);
(2)从操作栈定存储到局部变量表,如ISTOREASTORE等;
(3)将常量加载到操作栈顶,ICONST,BIPUSH,SIPUSHLDC等;

深入理解JVM——字节码
2、运算指令

对两个操作栈帧上的值进行运算,并把结果写入操作栈顶;

3、类型转换指令

显式转换两种不同的数值类型;

4、对象创建于访问指令

(1)创建对象指令,NEWNEWARRAY
(2)访问属性指令;
(3)检查实例类型指令;

5、操作栈管理命令
(1)出栈操作;
(2)赋值栈顶元素并压入栈;

6、方法调用与返回指令

(1)INVOKEVIRTUAL指令:调用对象的实例方法;
(2)INVOKESPECIAL指令:调用实例初始化方法、私有方法、父类方法;
(3)INVOKESTATIC指令:调用类静态方法;
(4)RETURN指令:返回VIOD类型;

源码转为字节码的过程

深入理解JVM——字节码

  • 词法解析:通过空格分隔出单词、操作符、控制符等信息,将其形成token信息流,传递给语法解析器;
  • 语法解析:在语法解析时,把词法解析得到的token信息流按照Java语法规则组装成一课语法树,
  • 语法分析:在这个阶段需要检查关键字的使用是否合理、类型是否匹配、作用域是否正确等;
  • 生成字节码;

执行方式

字节码必须通过类加载过程加载到JVM环境后才可以执行,执行有三种模式:

  • 解释执行;
  • JIT编译执行;
  • JIT编译和解释混合执行。

混合执行

解释器在启动时先解释执行,省去编译时间,随着时间推进,JVM通过热点代码统计分析,识别出高频的方法调用、循环体、公共模块等,基于强大的JIT动态编译技术,将特典代码转换很久起码,直接交给CPU执行。

深入理解JVM——字节码

相关文章: