类加载

119 阅读2分钟

了的加载大致分为三个部分

  • 加载
  • 链接
  • 初始化

在加载这一过程中,首先会通过对应的类加载器把该类的class字节码文件,加载到方法区中。并在堆中创建一个Class对象实例。作为我们访问方法区这些数据的入口。

链接

链接这个阶段又将细分为三个阶段

  • 验证
  • 准备
  • 解析

验证这一阶段就是看class文件是否是合法的文件。

准备这一阶段,就是在初始化类变量。首先会为类变量分配内存,并为其进行初始化。在1.7中类变量是被分配在方法区中,而1.7方法区的实现是永久代。1.8的类变量是被分配在Class对象的尾部,也就是在堆中。当由static修饰的变量,将会设置默认值。当由static final 修饰,这里会直接进行赋值。这里有个区分点,当static final 修饰的是基本数据类型,或字面量字符串,就会在这个阶段进行赋值。但是当修饰的是引用数据类型。赋值阶段将会在初始化阶段。

解析这一阶段主要是针对,将class字节码常量池的符号引用替换成直接引用。这里说明下什么是符号引用,什么是直接引用。符号引用就是用一堆字面量符号来作为指令所引用的结果(比如一个指令需要某个类,通过引用去查找,但此时只能找到字面量符号,并不能找到真正的该类型。因为此时还未加载到内存)直接引用就是,把那些字面量符号变为内存中真实的地址,引用也能真正的找到需要的信息。

初始化

首先初始化会调用一个方法,说说这个方法是干什么的,这个方法会把static 修饰的 静态变量,静态代码块,从上往下,依次放入该方法中,然后执行该方法。简单来说就是,执行类变量的赋值操作,和静态代码块的执行。

这个方法的执行是线程安全的,不会出现线程不完全。jvm会去保证他的线程安全。具体的化,就自己详细了解吧。

本文使用 文章同步助手 同步