在Java开发中,开发人员可能会遇到ClassNotFoundException,代表JVM没有找到
我们所需的类。JVM如何加载Java类,这与其双亲委派机制有关。
什么是双亲委派机制?
双亲委派机制是指JVM在加载Java类时使用的一种机制。
双亲委派机制流程分析
JVM类加载器类型可分为以下四种:
- 启动类加载器(BootstrapClassLoader):负责将JAVA_HOME/jre/lib路径下,或-Xbootclasspath系统变量指定位置的类库加载到内存中
- 扩展类加载器(ExtClassLoader):负责将JAVA_HOME/jre/lib/ext,或java.ext.dirs系统变量指定的路径下的类库加载到内存中
- 应用程序类加载器(AppClassLoader):负责将系统类路径CLASSPATH中的类加载到内存中
- 自定义类加载器:通过继承ClassLoader实现的自定义的类加载器
从最下层自定义类加载器开始,当类加载器加载类时,会先委托给父类加载器,父类加载器如果还有上层加载器,会继续向上委托,直到委托给启动类加载器,这是一个向上的委派过程。
此时,当最顶层启动类加载器发现没有找到要加载的类,会向下委派给子类加载器去加载,直到委派给最下层类加载器,这是向下的委派过程。
当以上加载流程走完,仍然没有加载到这个类,那么JVM会抛出ClassNotFoundException异常。
为什么要用双亲委派机制
通过有序的双亲委派加载机制,JVM优先使用启动类加载器加载系统核心的类库,保证了系统类库加载的安全性;向下加载的过程,也保证了类加载的完整性;此外,JVM的类加载机制又能保证类加载的唯一性(每个Java类都有自己唯一的命名空间,如:java.lang.Object)。