类加载器
1.什么是类加载器?
- 启动类加载器(Bootstrap ClassLoader):这是JVM自带的类加载器,负责加载Java的核心类库,如rt.jar等。由于安全原因,启动类加载器加载的类不能被其他类加载器加载的类所引用。
- 扩展类加载器(Extension ClassLoader):负责加载Java的扩展类库,一般位于$JAVA_HOME/jre/lib/ext目录下。
- 系统类加载器(System ClassLoader):也称为应用类加载器(Application ClassLoader),它负责加载应用程序的类路径(classpath)下的所有类。
- 自定义类加载器:开发者可以通过继承
java.lang.ClassLoader
类来自定义类加载器,以满足特殊需求,如热部署、代码加密等。
2.什么是双亲委派机制?
Java的类加载器采用双亲委派模型(Parent Delegation Model)。
当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中。只有当父类加载器无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子类加载器才会尝试自己去加载。
举个例子:如图
1.Student类:这是一个我们自己加载的类。一开始准备在AppClassLoader加载,但它先不加载,它委托给它的上级加载器ExtClassLoader加载,然后ExtClassLoader继续向上委托。但Student类不在JAVA_HOME/jre/lib目录或JAVA_HOME/jre/lib/ext目录下,因此这两个加载器都不会加载Student类。这时候才会由AppClassLoader加载。
2.String类:同上,它会从AppClassLoader一路向上委托,因为String类在JAVA_HOME/jre/lib目录中,因此BootStrapClassLoader就会加载String类。
JVM为什么采用双亲委派机制?