java 文件编译后的 class 文件, java 跨平台的中间层, JVM 通过对字节码的解释执行 (执行模式, 还有 JIT 编译执行, 下面讲解), 屏蔽对操作系统的依赖. 一个字节(8 位) 可以储存 256 中不同的指令, 这样的指令就是字节码, java 所有指令有 200 个左右, 这些指令组成了字节码文件(.class).
一, 字节码的主要指令:
.class 文件里面的十六进制文件 (如: 图一), 其中 CAFE BABE 是标志这个文件为 java 的编译后的文件, 00000034 代表版本号, 01670700 一个字节(8 位) 就是一个字节指令, 由于数值指令太难看懂, 我们可以用 javap 将指令翻译为助记指令(如: 图二).
图一
图二
1, 加载或储存指令
在栈帧中, 通过指令操作数据在局部变量表与操作栈间传递.
ILOAD,ALOAD: 将 int, 对象引用类型从局部变量表压入操作栈顶;
ISTORE,ASTORE: 将 int, 对象引用类型从操作栈顶储存到局部变量表里;
ICONST,BIPUSH,SIPUSH,LDC: 将常亮加载到操作栈顶.
2, 运算指令
对操作栈上的值进行运算, 并把结果写入操作栈顶, 如 IADD,IMUL.
3, 类型转换指令
I2L,D2F
4, 对象创建与访问指令
NEW
除了字节码指令外, 还包括像 LINENUMBER 储存字节码与源码对应, 方便调试定位; LOCALVARIABLE 储存当前方法使用到的局部表量表.
二, java 源码文件转化为字节码 (.class) 文件的过程
JAVA 源文件 ---------->词法解析 ---------->语法解析 ---------->语义分析 --------->生成字节码 --------->字节码文件
词法分析: 根据空格分割出单词, 操作符等, 形成 token 信息流;
语法分析: 根据 token 流和 java 语法规范生成语法树;
语义分析: 检查关键字, 类型匹配是否正确;
三, 执行模式
1, 解释执行
JVM 通过加载到的字节码进行执行;
2,JIT 编译执行
将热点代码 (例如: 高频方法体, 循环体, 公共模块) 直接翻译成机器码, 提高以后的执行效率;
3,JIT 编译执行与解释执行混合执行(主流 JVM 执行模式)
每次方法调用的时候, 方法调用计数器加 1, 如果计数达到阈值, 请求编译成机器码, 将机器码放在 Code cache 里面, 下次执行查看是否已编译成机器码, 已编译的直接执行机器码, 没有编译的通过解释执行(也就是执行字节码);
来源: https://www.cnblogs.com/java-zzl/p/9862329.html