jvm有三个重要的内置加载器,分别是:BootstrapClassLoader、ExtensionClassLoader、AppClassLoader,除BootstrapClassLoader外均由java实现且继承java.lang.Classloader类:
- BootstrapClassLoader:启动类加载器,最顶层的类加载器,由c++实现,负责加载%JAVA_HOME%/lib目录下的jar包和类以及-Xbootclasspath参数指定路径下的所有类。
- ExtensionClassLoader:扩展类加载器,负责加载%JRE_HOME%/lib/ext目录下的jar包和类,或被 java.ext.dirs 系统变量所指定的路径下的jar包。
- AppClassLoader:应用程序类加载器,面向用户程序的类加载器,负责加在classpath路径下的所有的jar包和类。
双亲委派模型
每一个类都对用有自己的类加载器,系统中的类加载器在协同工作的时候会默认使用双亲委派模型。即每一个类都默认使用其父类的类加载器。当父类加载器为null时,会使用BootstrapClassLoader来进行类加载。
双亲委派模型可以避免类重复加载,保证程序的稳定运行,因为同一个类文件被不同的加载器加加载生成的是两个不同的类。