类的加载过程
首先了解下java中jvm的内存结构。图来自“纯洁的微笑”
下图来源于纯洁的微笑博客
类的加载过程分为
加载–>连接–> 初始化
其中连接又分为 验证 、准备、解析。
加载、验证、准备、初始化这四个阶段发生得顺序是固定得,解析不一定,它有可能是在初始化之后才发生,这也是java中得动态绑定得基础。而且这几个过程开始得顺序是固定的,但是却不一定是按照这个顺序完成,有时他们的执行是交叉进行的。
加载
查找并加载类的二进制数据。分为几个步骤
加载是类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情:
- 通过一个类的全限定名来获取其定义的二进制字节流。
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
- 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。
连接
其中包括以下几个过程
1 .验证:确保被加载的类的正确性
2. 准备:为类的静态变量分配内存,并将其初始化为默认值
3. 解析:把类中的符号引用转换为直接引用
初始化
初始化,为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化。在Java中对类变量进行初始值设定有两种方式:
-
假如这个类还没有被加载和连接,则程序先加载并连接该类
-
假如该类的直接父类还没有被初始化,则先初始化其直接父类
-
假如类中有初始化语句,则系统依次执行这些初始化语句
类初始化时机:
只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种:
-
创建类的实例,也就是new的方式
-
访问某个类或接口的静态变量,或者对该静态变量赋值
-
调用类的静态方法
-
反射(如Class.forName(“com.shengsiyuan.Test”))
-
初始化某个类的子类,则其父类也会被初始化
-
Java虚拟机启动时被标明为启动类的类(Java Test),直接使用java.exe命令来运行某个主类
本文参考
https://www.cnblogs.com/ityouknow/p/5603287.html