JVM类加载机制
BootStrapClassLoader 启动类加载器 加载JVM运行时需要的类
ExtClassLoader 扩展类加载器 加载jdk、jre /lib目录下的类
AppClassLoader 应用类加载器 加载classpath目录指定的类
CustomClassLoader 用户自定义类加载器 用户自定义的类
加载步骤采用的双亲委托机制:
用户自定义加载器会将加载请求交给父类,父类再交父类,一层层上交,知道顶层启动类加载器;然后顶层加载如果加载不到,就会将委托给子类加载,一层层下传,如果加载不到,则抛出异常ClassNotFoundException;
tomcat加载机制:
1、Bootstrap引导类加载器 主要加载jvm启动需要的类和扩展类加载器加载的jre/jdk lib目录下的类
2、system 系统类加载器 主要加载的是tomcat启动需要的类 如bootstrap.jar
3、然后是应用类加载器加载web-inf/classes 目录下的类
4、再是应用类加载器加载web-inf/classes 目录下的类
5、common 公共类加载器 加载CATALINA_HOME/lib目录下的类
1、先在本地缓存中查找是否已经加载过该类(对于一些已经加载了的类,会被缓存在resourceEntries这个数据结构中),如果已经加载即返回,否则 继续下一步。
2、让系统类加载器(AppClassLoader)尝试加载该类,主要是为了防止一些基础类会被web中的类覆盖,如果加载到即返回,返回继续。
3、前两步均没加载到目标类,那么web应用的类加载器将自行加载,如果加载到则返回,否则继续下一步。
4、最后还是加载不到的话,则委托父类加载器(Common ClassLoader)去加载。