简介
我们知道java程序运行时,.java文件会被编译器变成成.class文件。
类加载机制指的是将这些.class文件中的二进制数据读入到内存中,并对数据进行校验,解析和初始化。
最终,每一个类都会在方法区保存一份它的元数据,在堆中创建一个与之对应的Class对象。
类加载主要用三个阶段:加载、连接、初始化。
1.加载(Loading)
将class文件读入内存,由类加载器生成java.lang.Class对象。
2.连接(Linking)
将类的二进制数据合并进JRE中。
连接可以分为:验证、准备、解析三个阶段。
- 验证
对.class文件的文件格式、元数据、字节码、符号引用进行校验。 - 准备
给静态变量分配内存、进行默认初始化。 - 解析
jvm将常量池的符号引用替换成直接引用。简单的说将计算机看不懂的变量用能够解析的地址来代替。
什么是符号引用?
Java代码在编译期间,是不知道最终引用的类型,具体指向内存中哪个位置的,这时候会用一个符号引用,来表示具体引用的目标是"谁"。Java虚拟机规范中明确定义了符号引用的形式,符合这个规范的前提下,符号引用可以是任意值,只要能通过这个值能定位到目标。
什么是直接引用?
直接引用就是可以直接或间接指向目标内存位置的指针或句柄。
3.初始化
主要针对静态成员(类加载阶段),执行显示初始化进行赋值操作。