虚拟机执行子系统

版权声明:懦怯囚禁人的灵魂,希望可以令你感受自由。强者自救,圣者渡人 https://blog.csdn.net/yeiweilan/article/details/79263496

类文件结构

这里写图片描述
java语言中的各种变量,关键字和运算符号的语义最终都是由多条字节码命令组合而成的,因此字节码命令所能提供的语义描述能力肯定会比java语言本身更加强大。

  • Class类文件的结构
    Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎都是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。
    根据java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表。
  • 无符号数属于基本的数据类型,以u1,u2,u4,u8来分别分别代表1个字节,两个字节……,无符号数可以用来描述数字,索引引用,数量值或者按照UTF-8编码构成字符串值。
  • 表是有多个无符号数或者其他表作为数据项构成的符合数据类型,所有表都习惯性的以“-info”结尾。表用来描述有层次关系的符合结构的数据,整个Class文件本质上就是一张表。这里写图片描述
  • 魔数与Class文件的版本
    每个Class文件的头4个字节称为魔数,它唯一的作用是确定这个文件是否为一个能被虚拟机接受的Class文件。紧跟着魔数的4个字节存储的是Class文件的版本号,第5和第6个字节是次版本号。第7和第8个字节是主版本号

虚拟机类加载机制

  • 类加载的时机
    这里写图片描述
    加载,验证,准备,初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析不一定:它在某些情况下可以在初始化阶段之后在开始,这是为了支持java语言的运行时绑定
  • 遇到new,getstatic,putstatic或invokestatic这4条字节码指令时,如果类没有进行初始化,则需要先触发器初始化。
  • 使用反射包的方法对类进行反射调用的时候,如果没有进行过初始化,则需要先触发其初始化。
  • 当初始化一个类的时候,如果发现其父亲还没有进行过初始化,则需要先触发其父类的初始化。
  • 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。

猜你喜欢

转载自blog.csdn.net/yeiweilan/article/details/79263496