JVM之类的加载过程(二):链接——>Linking

类的加载过程简图:

这篇主要讲解图中红框的部分:链接(Linking):

链接主要分为三个子阶段:

1.验证(Verify):

目的 在于确保class 文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机的自身安全。

比如class 文件的二进制字节流 都是以CA FE BA BE 开头的

主要包括四种验证:文件格式验证,元数据验证,字节码验证,符号引用验证。

2.准备(Prepare):

a.为类变量分配内存并且设置该类变量的默认初始值,即零值。不同的数据类型,默认初始值不同,int 类型的默认初始值是0,double 类型的默认初始值是0.0,引用数据类型的默认初始值是 null。

b.这里不包含引用final修饰的static,因为final 在编译的时候就会分配了,准备阶段会显示初始化。

c.这里不会为实例变量分配初始化类变量会分配在方法区中,而实例变量是会随着对象一起分配到java堆中。因为这时候还没有创建对象,比如后期在方法里创建一个对象,这时候才会对他进行初始化。

3.解析(Resolve):

a.将常量池内的符号引用转换为直接引用的过程

比如:将下面的代码进行反编译

反编译为:

上图发下会加载很多类,别看只有一个打印鱼鱼, 这个语句所需要的类太多,不会都写到这个class 文件中,就会用到符号引用。

b.事实上,解析操作往往会伴随着jvm在执行完初始化之后再执行。

c.符号引用就是一组符号来描述引用的目标,直接引用就是直接指向目标的指针。

猜你喜欢

转载自blog.csdn.net/Hao_JunJie/article/details/114905765
今日推荐