Java 类加载过程和类加载器的理解
-
加载
将
.class
字节码文件内容加载到内存中,并将这些静态存储结构转换成方法区的运行时数据结构,然后生成一个代表该类的java.lang.Class
对象,作为方法区的类数据的访问入口(即引用地址)。所有访问或者使用类数据只能通过这个 Class 对象。这个加载过程需要类加载器(ClassLoader
)的参与。 -
链接:
java
类的二进制代码合并到JVM
的运行状态之中的过程。- 验证:确保加载的类信息是否符合
JVM
的规范。 - 准备:为类变量(static)分配内存并且设置初始值,这些内存都在方法区中分配。
- 解析:虚拟机常量池中的符号引用(常量名)替换为直接引用(地址引用)的过程。
- 验证:确保加载的类信息是否符合
-
初始化
- 执行类构造器
<clinit>()
方法的过程。类构造器<clinit>()
方法是由javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。 - 当初始化一个类的时候,如果其父类没有被初始化,则需要先初始化其父类。
- 虚拟机会保证一个类的
<clinit>()
方法在多线程环境中被正确的加锁和同步。
- 执行类构造器