`
lg70124752
  • 浏览: 59199 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

深入理解java虚拟机学习笔记(四)--类文件结构

    博客分类:
  • jvm
阅读更多
第五章 调优案例分析与实践
1、-XX:+PrintGCTimeStamps 打印GC停顿时间
第六章 类文件结构
1、Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分配符,这使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。
Class文件只有两种数据类型:无符号数和表。无符号数属于基本的数据类型,以u1,u2,u4,u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值,或者按照UTF-8编码构成字符串值。表是由多个无符号数或其他表作为数据项构成的复合数据类型,所有表都习惯性地以“_info”结尾。
Class文件格式
类型 名称 数量
u4 magic 1
u2 minor_version   1
u2      major_version   1
u2      constant_pool_count 1
cp_info constant_pool   constant_pool_count -1
u2      access_flags    1
u2       this_class     1
u2      super_class      1
u2      interfaces_count 1
u2      interfaces        interfaces_count
u2      fields_count     1
field_info fields        fields_count
u2      methods_count    1
method_info methods       methods_count
u2      attributes_count 1
attribute_info attributes  attributes_count
6.1魔数与Class文件的版本
每个Class文件的头4个字节称为魔数(Magic Number),它唯一的作用是用于确定这个文件是否为一个能被虚拟机接受的Class文件。值为:0xCAFEBABE.紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6个字节是次版本号(Minor Version),第7个和第8个字节是主版本号(Major Version)。从45开始,高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,即使文件格式并未发生变化。
6.2常量池
紧挨着主次版本号之后的是常量池入口,是第一个出现的表类型数据项目,常量数量不固定,常量池容量计数值是从1而不是0开始的,如计数为22,索引值为1-21,将第0项常量空出来是有特殊考虑的,这样做是为了满足后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的意思,这种情况就可以把索引置为0来表示。其它集合类型都是从0开始的。
常量分为:字面量(Literal)和符号引用(Symbolic References)。字面量如文本字符串、被声明为final的常量值等;符号引用包括:类和接口的全限定名(Fully Qualified Name)、字段的名称和描述符(Descriptor)、方法的名称和描述符。
6.3 访问标志
在常量池结束之后,紧接着的2个字节代表访问标志(access_flags),这个标志用于识别一些类或接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话是否被声明为final,等等。
6.4类索引、父类索引与接口索引集合
类索引和父类索引都是一个u2类型的数据,而接口索引集合是一组u2类型的数据集合,Class文件中由这三项数据来确定这个类的继承关系。
6.5字段表集合
字段表用于描述接口或类中声明的变量。描述一个字段可以包括的信息有:字段的作用域(public,private,protected修改符)、是类级变量还是实例级变量(static修饰符)、可变性(final)、并发可见性(volatile修饰符,是否强制从主内存读写)、可否序列化(transient修饰符)、字段数据类型、字段名称。
描述符标识字符含义
B 基本类型byte
C 基本类型char
D 基本类型double
F 基本类型float
I 基本类型int
J 基本类型long
S 基本类型short
Z 基本类型boolean
V 特殊类型void
L 对象类型,如Ljava/lang/Object;
对于数组类型,每一维度将使用一个前置的“[”字符来描述。
6.6ConstantValue属性
作用是通知虚拟机自动为静态变量赋值,只有被static关键字修饰的变量才可能使用这项属性。
6.7InnerClasses属性
用于记录内部类一宿主类之间的关联。
6.8Deprecated及Synthetic属性
deprecated和Synthetic两个属性都属于标志类型的布尔属性。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics