了的加载大致分为三个部分
- 加载
- 链接
- 初始化
在加载这一过程中,首先会通过对应的类加载器把该类的class字节码文件,加载到方法区中。并在堆中创建一个Class对象实例。作为我们访问方法区这些数据的入口。
链接
链接这个阶段又将细分为三个阶段
- 验证
- 准备
- 解析
验证这一阶段就是看class文件是否是合法的文件。
准备这一阶段,就是在初始化类变量。首先会为类变量分配内存,并为其进行初始化。在1.7中类变量是被分配在方法区中,而1.7方法区的实现是永久代。1.8的类变量是被分配在Class对象的尾部,也就是在堆中。当由static修饰的变量,将会设置默认值。当由static final 修饰,这里会直接进行赋值。这里有个区分点,当static final 修饰的是基本数据类型,或字面量字符串,就会在这个阶段进行赋值。但是当修饰的是引用数据类型。赋值阶段将会在初始化阶段。
解析这一阶段主要是针对,将class字节码常量池的符号引用替换成直接引用。这里说明下什么是符号引用,什么是直接引用。符号引用就是用一堆字面量符号来作为指令所引用的结果(比如一个指令需要某个类,通过引用去查找,但此时只能找到字面量符号,并不能找到真正的该类型。因为此时还未加载到内存)直接引用就是,把那些字面量符号变为内存中真实的地址,引用也能真正的找到需要的信息。
初始化
首先初始化会调用一个方法,说说这个方法是干什么的,这个方法会把static 修饰的 静态变量,静态代码块,从上往下,依次放入该方法中,然后执行该方法。简单来说就是,执行类变量的赋值操作,和静态代码块的执行。
这个方法的执行是线程安全的,不会出现线程不完全。jvm会去保证他的线程安全。具体的化,就自己详细了解吧。
本文使用 文章同步助手 同步