虚拟机不与任何语言绑定,只与字节码这种二进制文件绑定。许多基于jvm的语言,都被编译成固定格式的字节码文件,具有了一致性,然后可以被统一的虚拟机执行。
Class文件结构:
class结构只有两种数据结构:
- 无符号数:基本数据结构,u1、u2、u4、u8代表1、2、4、8个字节的无符号数。可以描述数字、引用、UTF-8的字符串。
- 表:由无符号数组成的符合类型。整个class文件本质上就是一张表。
- 魔数:0xCAFEBABE
- 版本:四字节
- 常量池:首先是u2类型的计数,从1开始。常量池中主要存放两类数据:
- 字面量:文本字符串、fianl常量等。
- 符号引用:(c++有链接这一步,java没有,而是在运行时动态链接,也就是解析这些符号引用,翻译到具体的内存地址)
- 类和接口的权限定名
- 字段和方法的名称和描述符
- 访问标志:两字节表示类的访问信息。
- 类索引、父类索引、接口索引集合:确定类的继承关系。前两项是u2类型,第三个是集合。通过索引可以在前面的常量表中查找内容。所以java只能继承一个父类,可以实现多个接口。
- 字段表:描述声明的变量。
- 方法表:描述方法。不包括代码,代码被fangdao属性表中。
- 属性表
指令是由一个字节的操作码和后面0到多个的参数构成的,但jvm采用的是面向操作数栈而不是寄存器的架构,所以多数都只有一个操作码。只有一字节,所以总数最多256个。包括:
- 加载、存储指令:用于将数据在局部表量表和操作数栈中传输
- 运算指令:对操作数栈中的值进行运算,将结果写回操作数栈。
- 类型转换指令
- 对象创建与访问指令:创建对象、数组,访问字段、元素等。
- 操作数栈管理指令:交换、出栈等。
- 控制转移指令:控制下一条执行指令的位置。
- 方法调用和返回指令
- 异常处理指令
- 同步指令