类加载机制
生命周期
类的生命周期包括:
其中验证、准备、解析3个部分被称为连接。
- 加载
- 获取指定类的二进制流。
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
- 生成一个Class对象,作为方法区这个类的数据的访问入口。
- 验证
确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并不会危害虚拟机自身的安全。 - 准备
该阶段为类的static变量分配内存并设置相应数据类型的默认值,若该变量为final修饰,则赋初始值。 - 解析
该阶段是虚拟机将常量池内的符号引用替换为直接引用。 - 初始化
初始化类的其他变量和资源。
类加载器
- 启动类加载器
使用C++语言实现,是虚拟机自身的一部分。负责加载<JAVA_HOME>\lib目录或者被-Xbootclasspath参数指定路径中的并且被虚拟机识别的类库。 - 扩展类加载器
由sun.misc.Launcher$ExtClassLoader实现,负责加载<JAVA_HOME>\lib\ext目录或者java.ext.dirs系统变量指定的路径中的类库。 - 应用程序类加载器
由sun.misc.Launcher$AppClassLoader实现,负责加载classpath路径中的类库。 - 自定义类加载器
用户自己定义的类加载器
双亲委派模型
过程:一个类加载器收到了加载类的请求,它首先会在自身已经加载类的缓存中去寻找是否已经加载过这个类,如果加载过,就直接返回这个类,如果没有加载过,就将请求传递给父加载器,接着父加载器重复相同的动作。如果直至启动类加载器都未加载过这个类,那么从启动类加载器开始,寻找自身类加载路径中是否存在这个类,如果存在则加载类后返回,如果不存在就将请求传递给子加载器。子加载器接收到请求后,重复相同操作。