一、JVM类加载机制介绍
JVM父母委托模型概述:
JVM包含集中式类加载器。
1 bootstrap类加载器引导类加载器
2 ext类加载器扩展类加载器
3 app类加载器APP应用程序类加载器
4自定义类加载器用户定义类加载器
他们的区别上面也有说明。 请注意,不同的类加载器加载的类不同,因此如果用户加载器1有要加载的类,则其他用户不可用。
当JVM运行过程中,用户需要加载某些类时,会按照下面的步骤(父类委托机制)
1用户自己的类加载器将加载请求传递给父加载器,父加载器进一步传递给该父加载器,到达加载器树的顶部。
2顶级类加载器首先加载到该特定位置,如果无法加载,则传递给子类。
3如果尚未加载到最后一层的类加载,则会抛出异常ClassNotFoundException。
因此,按照这个过程可以想到,如果同样在CLASSPATH指定的目录中和自己工作目录中存放相同的class,会优先加载CLASSPATH目录中的文件。
二、TOMCAT类加载机制
tomcat启动时,会创建几种类型的加载程序。
1 Bootstrap 引导类加载器
加载启动JVM所需的类以及jre/lib/ext下的标准扩展类
2 System 系统类加载器
加载tomcat启动类,如bootstrap.jar。 通常在catalina.bat或catalina.sh中指定。 位于CATALINA_HOME/zrdc下。
3 Common 通用类加载器
加载tomcat中使用和常用的类,如CATALINA_HOME/lib下的servlet-API.jar
4 webapp 应用类加载器
每个APP应用程序在部署后创建唯一的类加载器。 此类加载器加载WEB-INF/lib下的jar文件中的class文件和WEB-INF/classes下的class文件。
当应用需要到某个类时,则会按照下面的顺序进行类加载
使用bootstrap引导类加载器加载
使用系统类加载器加载
3使用APP应用程序类加载器加载到WEB-INF/classes
4使用APP应用程序类加载器加载到WEB-INF/lib
使用common类加载器加载到CATALINA_HOME/lib
三、违反父母委托机制tomcat类加载机制违反父母委托原则,部分未加载非基础类(Object、 String等) ),则优先加载每个web APP应用程序自己的类加载器(WebAppClassLoader ),如果无法加载,则委托公共类加载器的具体加载逻辑是WebAppClassLoader
首先,在本地缓存中检查该类是否已经加载。 一些加载的类缓存在名为resourceEntries的数据结构中。 如果已加载,则返回;否则,进入下一步。 使“系统类加载器”(AppClassLoader )尝试加载该类,主要是因为某些基类被web中的类复盖,加载到中时会返回,而不会继续返回。 如果前两个步骤未加载到目标类中,则web APP应用程序的类加载器将自行加载。 如果已加载,则返回;否则,进入下一步。 如果仍然无法加载,请委托“父类加载器”(Common ClassLoader )加载。 3第四步的顺序已违反父母委托机制,除tomcat外,还有JDBC、JNDI、Thread.currentThread ().setContextClassLoader ); 等等很多地方都同样违反了父母的请求。