1.类加载是什么?
将 “.Java” 的类文件 转换成 “.class” 的字节码文件 。
然后JVM负责执行 “.class” 文件。
2.类加载过程?
5 个阶段:载入、验证、准备、解析和初始化
这 5 个阶段一般是顺序发生的,但在动态绑定的情况下,解析阶段发生在初始化阶段之后。
(1)Loading(载入)
JVM 在该阶段的主要目的
是将字节码,从不同的数据源,转化为二进制字节流,加载到内存中,并生成一个代表该类的 java.lang.Class
对象。
(2)Verification(验证)
JVM 会在该阶段对二进制字节流进行校验,只有符合 JVM 字节码规范的才能被 JVM 正确执行。该阶段是保证 JVM 安全的重要屏障,
下面是一些主要的检查。
- 确保二进制字节流格式符合预期(比如说是否以
cafe bene
开头)。 - 是否所有方法都遵守访问控制关键字的限定。
- 方法调用的参数个数和类型是否正确。
- 确保变量在使用之前被正确初始化了。
- 检查变量是否被赋予恰当类型的值。
(3)Preparation(准备)
JVM 会在该阶段对类的静态变量 分配内存并初始化(对应数据类型的默认初始值,如 0、0L、null、false 等)。
静态变量默认为 0 null 等初始值
静态常量则为 本身定义的值 如 59 王五 等
(4)Resolution(解析)
该阶段将常量池中的符号引用转化为直接引用。
what?符号引用,直接引用?
符号引用以一组符号(任何形式的字面量,只要在使用时能够无歧义的定位到目标即可)来描述所引用的目标。
在编译时,Java 类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如 com.Wanger
类引用了 com.Chenmo
类,编译时 Wanger 类并不知道 Chenmo 类的实际内存地址,因此只能使用符号 com.Chenmo
。
直接引用通过对符号引用进行解析,找到引用的实际内存地址。
(5)Initialization(初始化)
该阶段是类加载过程的最后一步。在准备阶段,类变量已经被赋过默认初始值,而在初始化阶段,类变量将被赋值为代码期望赋的值。
相当于执行类的构造方法。
3.类加载器有哪些?双亲委派模型是什么样子?
双亲委派模型:
如果一个类加载器收到了加载类的请求,它会先把请求委托给上层加载器去完成,上层加载器又会委托上上层加载器,一直到最顶层的类加载器;
如果上层加载器无法完成类的加载工作时,当前类加载器才会尝试自己去加载这个类。