java类加载器及常用java应用服务器类加载机制简介

以下内容出自一个同事的整理资料。

 

一。java类加载器机制简介

 

这个由Bootstrap Loader -> ExtClassLoader -> AppClassLoader,就是java类装载器的层次体系。

Bootstrap Loader是参考系统参数sun.boot.class.path;
ExtClassLoader是参考系统参数java.ext.dirs;
AppClassLoader 是参考从系统参数java.class.path取出的字符串。

Bootstrap Loader搜索路径是系统参数,无法更改,他的搜索路径为jdk目录\jre\lib下的一些jar包;
ExtClassLoader的搜索路径为jdk目录\jre\lib\ext下的所有class或jar包;
AppClassLoader的搜索路径为系统的classpath。

AppClassLoader和ExtClassLoader的搜索路径可以修改,但是不能在执行时间动态更改。

java中类装载采用“代理机制”,即子装载器如果需要装载一个类文件,首先会将此任务提交给父装载器,
如果父装载器找不到此类文件,才有子装载器来装载类文件,如果子装载器也找不到,
那么就会报告ClassNotFoundException异常。

 

如图所示:

 

二.tomcat应用服务器中的类加载机制

 

1.BootStrap classloader(加载JRE/lib下的rt.jar和其他重要jar文件)
2.ExtClassLoader (加载JRE/lib/ext下的jar文件,Java扩展框架使用)
3.AppClassLoader ($CATALINA_HOME/bin/下bootstrap.jar, commons-logging -api.jar,commons-daemon.jar,$JAVA_HOME/lib/tools.jar,jmx.jar)
4.common (加载$CATALINA_HOME/common/,Tomcat本身和Web App共享类)
5.Catalina (加载$CATALINA_HOME /server/,Tomcat本身使用的类)
Shared (加载$CATALINA_BASE /shared/,所有Web App共享类)
6.WebappClassLoader (加载各个Web App的class,不同的Web App被隔离开)

注意:Tomcat完全忽略了classpath的设置,而重新设置了classpath,所以AppClassLoader 载入的类将不是class path设置的类。

 

三.weblogic应用服务器中的类加载机制

 

当部署一个应用的时候,weblogic server会自动创建一个具有层次结构的类装载器。
在图中,
1. 系统类路径加载器负责装载应用中的所有的EJB JAR文件;
2. 应用程序加载器负责装载所有的Web application 中的WAR 文件(所有得jsp文件除外);
3. Jsp Classloader 负责装载Web application 中的所有的jsp 文件;

weblogic中默认有以下几个级别:
1.系统类路径,除了java路径和java扩展路径,这个算是级别最高的了。
2.APP-INF/lib or APP-INF/classes,它比系统类路径的级别低了一级。
3.WEB-INF/lib or WEB-INF/classes,这个应该是最低的级别了。

classLoader在装载类的时间会从上而下的顺序来装载类。首先装载java自身的类(安全考虑),如果没有找到要装载的类,就查找java扩展路径下的类,如果还没找到就系统类路径,在然后 APP-INF/lib or APP-INF/classes,再然后WEB-INF/lib or WEB-INF/classes。

 

如图所示:

 

你可能感兴趣的:(java,tomcat,Web,应用服务器,weblogic)