深入理解Java虚拟机笔记0x01

类文件结构

魔数

  • 0xCAFEBABE,用于表示文件类型,4字节。

Class文件版本

  • 4字节,高版本能够兼容低版本,但是不能运行更新版本的Class文件。

常量池

  • 入口有表示常量池容量计数值。
  • 主要包含字面量和符号引用。
  • 字面量:接近Java语言层面的常量概念,例如文本字符串,声明为final的常量值等。
  • 符号引用:包括类和接口的全限定名(含包名以及类名)、字段的名称和描述符、方法的名称和描述符。

访问标志

  • 用于标识该Class是类还是接口、是否为public、是否为abstract、是类的话是否为final等。

类索引、父类索引与接口索引集合

  • 用于确定类的继承关系。

字段表集合

  • 用于描述接口或者类中声明的变量,包括类级变量以及实例级变量,但是不包括方法内部声明的局部变量。
  • 字段描述信息包括:字段作用域(public、private、protected)、可变性(final)、并发可见性(volatile,是否强制从主内存读写)、可否被序列化(transient)、字段数据类型(基本类型、对象、数组)。

方法表集合

  • 类似字段表,同样包含类访问标志、名称索引、描述符索引、属性表集合等。
  • 方法中的代码在属性表集合中。

属性表集合

Code属性

  • Class文件中最重要的一个属性,主要包括方法编译后的字节码。
  • 异常表也在Code属性中,表示确定的代码范围(开始行数到结束行数)如果出现了某些异常要跳转到到位置。

字节码

支持的数据类型

  • byte、short、int、long、float、double、char、reference

指令类型

  • 加载和存储指令:常量读进操作栈、局部变量表读进操作栈、操作栈写入局部变量表
  • 运算指令:加法、减法、乘法、除法、求余、取反、位移、按位与、按位或、按位异或、自增、比较
  • 类型转换指令
  • 对象创建与访问指令:创建类实例、创建数组、访问类与实例、加载数组元素、写回数组元素、取数组长度
  • 操作数栈管理指令:出栈、复制栈顶元素并入栈、交换栈顶两个元素
  • 控制转移指令:条件分支、复合条件分支、无条件分支
  • 方法调用和返回指令
  • 异常处理指令
  • 同步指令
Author: SinLapis
Link: http://sinlapis.github.io/2019/06/20/深入理解Java虚拟机笔记0x01/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.