Java深入|JVM之类文件结构
类文件结构
文章目录
1)平台无关性、语言无关性
2)Class类文件结构
3)字节码指令
概述
-
平台无关性、语言无关性;实现一次编写,到处运行
- 各种不同平台的虚拟机与所有平台都使用统一的程序存储格式—— 字节码,这是构成平台无关性的基石,而实现语言无关性的基础仍然是虚拟机和字节码存储格式
- Java 源代码首先需要使用 Javac 编译器编译成
.class
文件,然后由 JVM 执行 .class 文件,从而程序开始运行。 - Java虚拟机只和存储字节码的Class文件这种特定的二进制文件格式关联,且并不关心Class的来源是何种语言
Class类文件结构
- Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件之中,中间没有添加任何分隔符。
- Class文件格式采用一种类似C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表
- magic number:每个Class文件的头4个字节
- 判断该文件是否为一个能被虚拟机接受的Class文件
- 版本号
- 包含主版本号(Major Version)和一系列次版本号(Minor Version)
- 次版本号 第5和第6个字节
- 主版本号 第7和第8个字节
- 判断该文件是否在虚拟机处理的有效范围内
- 常量池
- 使用一个前置的容量计数器加上若干个连续的常量项
- 存放着两大类常量:字面量和符号引用
- 访问标志(access_flags)
- 常量池结束后两个字节
- 识别一些类或接口层次的访问信息
- 类索引、父类索引与接口索引集合
- 通过这三项数据来确定这个类的继承关系
- 字段表集合
- 用于描述借口或者类中声明的变量
- access_flags、name_index、description_index
- 方法表集合
- 用于描述接口或者类中声明的方法
- 属性表集合
- 用于描述某些场景专有的信息,在字段表、方法表等都携带自己的属性表集合
字节码指令
- 由一个字节长度的表示某种特定含义的操作(**操作码)**和零至多个代表此操作所需的参数(操作数)构成
- 并非每种数据类型和每一种操作都有对应的指令,有些单独的指令可以在必要的时候用来将一些不支持的类型转换为可被支持的类型
- 分类
- 加载和存储指令
- 运算指令
- 类型转换指令
- 对象创建与访问指令
- 操作数栈管理指令
- 控制转移指令
- 方法调用和返回指令
- 异常处理指令
- 同步指令
参考
《深入理解Java虚拟机》
类文件结构
理解JVM之类文件结构