深入理解jvm 一 类文件结构

1、class类文件结构

class文件是一组以8位字节为基础单位的二进制流

class文件只有两种数据类型:无符号数和表

无符号数:基本的数据类型,可以用来描述数字、索隐引用、数量值或者按照UTF-8编码构成的字符串值。

表:多个无符号数或者其他表组成的复合数据结构。

class文件基本组成

1、魔数:每个class文件的头4个字节成为魔数,唯一作用是确定这个文件是否为一个能被虚拟机接受的class文件

2、版本号:魔数后紧跟的4字节,存储ckass文件的版本号。

3、次版本号:版本号后2字节是次版本号。

4、主版本号:次版本号后2个字节是主版本号.

5、常量池:紧跟着主版本号,常量池可以理解为class文件之中的资源仓库,占据最多的空间,跟其他项目关联最多的数据类型,也是class文件中第一个出现的表类型数据项目。,常量池入口处有一个容量计数,代表常量池中有多少项常亮。 常量池只存储字面量和符号引用。常量池中每一个常量都是一个表

    字面量:类似Java语言层面的常量如文本字符串,声明为final的常量等。

    符号引用:类和接口的全限定名,字段名称和描述符,方法名称和描述符。(java中对字段和方法的常量长度是65535,所以字段名和方法名不能超过64kb)

6、访问标志:在常量池结束之后出现,长度两个字节,用来标识一些类或者接口层次的访问信息,比如这个class是类还是接口,是否是public,是否是抽象类等等。

7、类索引、父类索引、接口索引集合:class文件中由这三项数据来确定这个类的继承关系。出现在访问标志之后

    类索引:确定这个累的全限定名。

    父类索引:确定这个类的父类全限定名。由于java不允许多重继承,所以父类索引只有一个。

    接口索引集合:描述了这个类实现了哪些接口。

8、字段表集合:描述接口或者类中声名的变量,包含类级变量和实例级变量,字段包括类级变量以及实例变量,但是不包括在方法内部声明的局部变量。

    字段修饰符:例如是否是public,是否是private,是否是final等等。都是由布尔值组成。

    全限定名:仅仅是把类全名中.替换成/,是一个类的完整路径,以 ; 结束

    简单名:例如类中的inc()方法 简单名就是inc。

    方法和字段的描述符:描述字段的数据类型、方法的参数列表和返回值

9、方法表集合:方发表集合依次包括你了访问标志、名称索引、描述符索引、属性表集合,与字段表集合类似。注意方法中的代码经过编译器编译成字节码指令,存放在方法属性表集合中一个名为Code的属性里

    属性表集合:class文件、字段表、方法表都可以携带自己的属性表集合,用于描述专用的信息。结构自定义,要求像class文件那么严格。java程序方法体中代码经过javac编译后存储在code属性内。


2、字节码指令简介

java虚拟机指令是由一个字节长度的代表着某种特定操作含义的数字(操作码)和零至多个代表此操作所需参数(操作数)构成。

执行模型:


加载和存储指令:将数据在战阵中的局部变量表和操作数栈之间来回传输。

运算指令:用于对两个操作数栈上的只进行某种特定运算,并把结果重新存入到操作栈顶。

类型转换指令:可以将两种不同的数值类型进行相互转换。

对象创建指令:对实例和数组进行创建

控制转移指令:有条件或者无条件的修改PC寄存器的值

方法调用和返回指令:调用对象实例,调用接口方法,调用特殊处理实例的方法,调用类方法(static)和return方法

异常处理指令:显式抛出异常操作都是有异常处理指令来实现的

同步指令:synchronized语句标识

猜你喜欢

转载自blog.csdn.net/qq_31615049/article/details/80292389