《深入理解Java虚拟机》笔记之第6章 类文件结构

 2019-12-22 11:02  阅读(735)
文章分类:JVM

1、Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中,中间没有添加任何分隔符。

Class文件中只有两种数据类型:无符号数和表。无符号数可以描述数字、索引引用、数量值,或者按照UTF-8编码构成的字符串值;表是由多个无符号数或其他表作为数据项构成的复合数据类型。整个Class文件本质上就是一张表。

2、Class文件的构成

(1)魔数:0xCAFEBABE,位于Class文件的头4个字节。

(2)属性表:Slot是虚拟机为局部变量为分配内存所使用的最小单位。对于byte、char、float、int、short、

boolean、reference和returnAddress等长度不超过32位的数据类型,每个局部变量占用1个Slot恩赐 double和long则需要用2个slot来存放。

code_length是一个u4类型的长度值,理论上最大值为232-1个,但是虚拟机中规定了一个方法不允许65535条字节码指令,否则会拒绝编译(某些复杂的JSP文件可能会出现这个问题)。

(3)this对象。在任何实例方法中,都可以通过“this”关键字访问到此方法所属的对象。其实现原理即:javac编译器在编译的时候把对this关键字的访问转变为对一个普通方法参数的访问,然后在虚拟机调用实例方法时自动传入此参数即可。因此在实例方法的局部变量表中至少会存在一个指向当前对象实例的局部变量。但如果此方法是类方法(静态方法),则可能不存在局部变量(Args_size=0)。

(4)ConstantValue属性。虚拟机的变量赋值。

对非static类型的变量(也就是实例变量)的赋值是在实例构造器方法中进行的;

对类变量,有两种赋值方式:A、赋值在类构造器方法中进行,或者使用ConstantValue属性进行赋值。

对Sun Javac编译器来说,如果同时使用final和static来修饰一个变量(即常量),并且其数据类型是基本类型或String,就生成ConstantValue属性来进行初始化;如果该变量未被final修饰,或者并非基本类型及字符串,就选择在方法中进行初始化。(P166)

3、Java虚拟机执行字节码是基于栈的体系结构。(P158)

点赞(1)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 《深入理解Java虚拟机》笔记之第6章 类文件结构

相关推荐