java类的加载过程及双亲委派机制
加载过程如下:
加载 —> 验证 —> 准备 —> 解析 ----> 初始化
1. 加载
加载的主要动作是讲外部的.class文件加载到java的方法区内。
2.验证
在java虚拟机中,不是任何的内都可以加载,如一些恶意文件等,验证这阶段的工作就是验证java的class文件是否正确,是否符合jvm虚拟机的规范等
3.准备
准备是为一些类的变量分配内存,并将其初始化成默认值,实例对象这时候是不会分配内存的,这些动作是在方法去上进行的
4.解析
解析是将类中的符号引用转为直接引用的过程,就是将变量指向变量所在的内存。
5.初始化
最后一步成员变量的初始化
延伸扩展
java静态代码块一般是在准备阶段执行,而构造函数及成员变量赋值在初始化阶段,再记录一下继承的构造函数,一般都是先执行父类的构造函数,再执行子类的构造函数,如果出现多继承,则逐级执行
类的加载器
以下是几个常用的类加载器:
Bootstrap ClassLoader
这是主要加载器,任何类的加载行为都是要经过它,加载核心类库,是随着jvm启动的
Extention ClassLoader
扩展类加载器主要加载lib/ext下的jar包
App ClassLoader
加载我们所使用的类
Custom ClassLoader
自定义加载器,支持一些个性化的扩展功能
双亲委派机制
类的加载器的加载过程如下
Bootstrap ClassLoader -> Extention ClassLoader -> App ClassLoader-> Custom ClassLoader
加载的时候,每加载一个类基本上都是先询问上层的类,如果上层的类可以帮忙加载则由上层的类进行加载。如App ClassLoader现在有任务加载一个类,他会先询问 Extention ClassLoade是否可以加载,Extention ClassLoade就又会询问Bootstrap ClassLoader,如Bootstrap ClassLoader能够加载则由Bootstrap ClassLoader进行加载,如Bootstrap ClassLoader不能加载Extention ClassLoade可以加载,则由Extention ClassLoade进行加载,如果都不能加载则由App ClassLoader进行加载,这就是双亲委派机制,其实是单亲委派机制,是因为使用parent这个单词,因此习惯的被称为双亲委派机制
当然也有一些加载过程不是双亲委派机制的如:tomcat的加载过程,osgi的加载过程