java虚拟机——class文件结构

  • 来源:网络
  • 更新日期:2020-06-05

摘要:来自专辑 java虚拟机系列文章

来自专辑 java虚拟机系列文章

java虚拟机讲解第四篇

1、讲解内容逻辑梳理图:

逻辑图为百度脑图,以下为原图连接:http://naotu.baidu.com/file/782b9fc9f78e729b19620026e615e5ad?token=94dc2c66cbffbd25

2、内容详细讲解:

2.1:class文件结构包含要素:

2.1.1、魔术(magic):class文件的头4个字节为魔术,用来确定class文件是否能被虚拟机接受。

2.1.2、主次版本号(minor_version、major_version):5、6字节为次版本号,7、8为主版本号,jdk从45开始递增版本号,jdk支持向下兼容版本,即jdk1.2可以运行jdk1.1编译的class文件。

2.1.3、接着主次版本号之后的是常量池(constant_pool_count、constant_pool):常量池中主要包括两大类常量,字面量和符号引用。字面量:文本字符串、声明为final的常量值。符号引用:类和接口的全限定名、字段的名称和描述符、方法的名称和描述符。

2.1.4、访问标志(access_flags):用户识别类或者接口层次信息。Class是类还是接口,是否定义为public,是否定义为abstract,如果是类,是否被声明为final。

2.1.5、类索引、父类索引、接口索引集合(this_class、super_class、interface_count、interfaces):类索引用于确定类的全限定名,父类索引用于确定父类的全限定名。除java.lang.Object类之外,其他所有类的父类索引都不为0。由于java支持多实现,所以接口索引为集合。

2.1.6、字段表集合(fields_count、fields):用于描述接口或类声明的变量,包括类级变量和实例级变量。字段信息包括:字段的作用域(public、private、protecte)、实例变量还是类变量(是否有static修饰)、可变性(是否有final修饰)、并发可见性(是否有volatile修饰)、可否被序列化(是否有transient修饰)、字段数据类型、字段名称。

2.1.7、方法表集合(methods_count、methods):包含访问标志(access_flags)、名称索引(name_index)、描述符索引(descriptor_index)、属性表集合(attributes)。方法内的代码在编译后会存放到属性表集合中一个名为Code的属性里面。

2.1.8、属性表集合(attributes_count、attributes):Class文件、字段表、方法表都包含了属性表集合。

a)、Code属性:java代码经过javac编译后字节码存在Code属性中。接口和抽象类的方法不会存在Code属性中。

b)、Exception属性:描述的是throws关键字后面列举的异常。

c)、LineNumberTable属性:描述源代码行号和字节码行号的对应关系,当程序抛出异常时使用。可选。

d)、LocalVariableTable属性:描述局部变量表中的变量和java源代码中的变量之间关系。可选。

e)、SourceFile属性:记录生成Class文件的源代码文件名称。可选。

f)、ConstantValue属性:通知虚拟机自动为static静态变量赋值。同时使用final和static修饰的基本类型和java.lang.String,编译后会生成ConstantValue属性并初始化,否则会在实例构造器(<clinit>)中初始化。

g)、InnerClasses属性:记录内部类和宿主类之间关系。

h)、Deprecated、Synthetic属性:Deprecated已弃用。Synthetic表示字段或方法不是由java源代码产生,由编译器自行添加。

i)、StackMapTable属性:该属性在虚拟机类加载字节码验证阶段被新类型检查验证器使用。一个方法的Code属性最多有一个该属性。

j)、Signature属性:泛型的标识,可出现在类、字段表、方法表结构中。

k)、BootstrapMethods属性:jdk1.7之后新增,该属性用于保存invokedynamic指令引用的引导方法限定符。

2.2、虚拟机实现方式分两种:

2.2.1、将输入的java虚拟机代码在加载和执行时翻译成另一种虚拟机的指令集。

2.2.2、将输入的java虚拟机代码在加载和执行时翻译成宿主机CPU的本地指令集(即JIT代码生成技术)。

往期回顾:

1)、Java虚拟机——运行时数据区域(图文方式讲解运行时数据区域的内容)

2)、java虚拟机——垃圾收集(图文方式讲解垃圾算法、垃圾收集器等内容)

3)、java虚拟机——性能监控常用命令(图文方式讲解性能监控常用命令)

4)、java虚拟机——class类文件结构(图文方式讲解类文件结构内容)

5)、java虚拟机——类加载机制(图文方式讲解类加载过程)

6)、java虚拟机——虚拟机字节码执行引擎(图文方式讲解字节码执行过程)

7)、java虚拟机——java文件编译过程(图文方式讲解java文件编译过程)

8)、java虚拟机——即时编译器和解释器(图文方式讲解即时编译器和解释器的工作内容)

9)、java虚拟机——内存模型和线程(图文方式讲解内存模型和线程内容)

10)、java虚拟机——线程安全与锁优化(图文方式讲解线程安全及锁优化内容)