类加载器的分类
JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。
从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。
无论怎么划分,我们最常见的类加载器始终只有三种:
虚拟机自带的加载器
在Java的日常应用程序开发中,类加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。
这里我们再提到一种十分常见的机制,叫双亲委派机制。
Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求由父类处理,它是一种任务委派模式。
工作原理:
如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;
如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归请求最终将到达顶层的启动类加载器;
如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子类加载器才会尝试自己去加载,这就是双亲委派模式。
我们再放一张示意图更加直观的了解双亲委派机制:
双亲委派机制的优势主要在于:
1.可以避免类的重复加载;
2.保护程序安全,防止核心API被随意篡改
由于我对JVM类加载器的学习还比较浅薄,有需要的话可以看一位知乎大佬对JVM更深的理解;
链接:https://zhuanlan.zhihu.com/p/185612299
原文:https://www.cnblogs.com/yizhipangmayuan/p/14698055.html