JVM的类加载机制概述
一、加载阶段
加载 -> 验证 -> 准备 -> 解析 -> 初始化
- 加载
JVM读取class文件,根据Class文件描述创建对象。将Class文件读取到运行时区域的方法区
,在堆
中创建Class对象。 - 验证
确保Class文件符合当前虚拟机的要求。 - 准备
在方法区为类变量分配内存空间并设置类中变量的初始值。需要注意final和static赋初值时期不同(static的初始化放在了构造器中,final在准备阶段赋值) - 解析
将常量池中的符号引用替换为直接引用。 - 初始化
执行类构造器中的<client>
方法,在编译阶段由编译器自动收集类中静态语句块和变量的赋值操作组成,若没有,则不会生成<client>
方法。(不一定所有场景都会执行类的初始化工作,如定义对象数组、用类名获取Class对象)
二、类加载器(ClassLoader)
JVM提供了三种——启动类加载器、扩展类加载器、应用程序类加载器。
- 启动类加载器:负责加载Java_HOME/lib中的类库,或通过环境变量设置的类库。
- 扩展类加载器:负责加载Java_HOME/lib/ext中的类库或通过环境变量设置的类库。
- 应用程序类加载器:负责加载用户自己的类库。
三、双亲委派机制(让父类帮自己做事情)
双亲委派机制指一个类收到类加载请求后,不会尝试自己加载这个类,而是把该类加载请求向上委派给其父类去完成,其父类在接收到该类加载请求后继续委派给父类。以此类推,所有的类加载请求都被向上委派到启动类加载器
中。
若父类发现自己无法加载该类,则将该信息反馈给子类并向下委派子类加载器加载该类,直到该类被加载成功。若找不到该类,则抛出ClassNotFound异常。
核心:保障类的唯一性和安全性,若存在包名相同的,则类将无法被加载。
拓展:OSGI(Open service GateWay Initiative)Java动态化模块化系统的一系列规范,旨在为实现Java程序模块化编程。