设为首页 收藏本站
查看: 567|回复: 0

[经验分享] Tomcat 6 启动过程分析 (7)

[复制链接]

尚未签到

发表于 2017-1-27 10:59:16 | 显示全部楼层 |阅读模式
ClassLoader
Class Loading是java提供的强大机制之一。JVM利用ClassLoader来装载用到的类文件。有两个原因会促使我们自定义ClassLoader:
1. 希望支持一个新的类仓库,而不只是本地文件系统(JVM提供的ClassLoader只能从本地文件系统中load类)。applet ClassLoader 就是一个例子。它支持从HTTP server上load类文件。
2. 希望在一个server上分离用户代码。比如servlet engine, 可能不同的开发者写出的servlet运行在一个engine里面,而他们之间相互不可知的。他们也当然希望自己的代码独立于别人的代码运行。通过为每一个开发者的servlets自定义一个 ClassLoader 把他们的code分离开了。因为在JVM中class是靠它的全限定名称(包名+类名)以及他的ClassLoader来唯一标示的。这样不同的ClassLoader 装入的类就彼此分开了。(A class is uniquely identified in a JVM using its fully qualified class name along with the instance of the ClassLoader that loaded the class. )。 JVM默认只是通过AppClassLoader来load我们的类。
Class and Data
class表示一段可执行的代码,而data则表示与这段代码关联的类的状态。状态可变,代码通常不能变。当我们将data和class关联起来的时候就是一个类的实例对象。不同的实例拥有不 同的data即状态,但公用一段class代码。在一个JVM中一个Loader指挥load一次同一个类。类是通过全限定名称标识的。不同的loader装的同一个类的类型都不兼容。(classes loaded by different loaders are completely different and not type-compatible to each other. )
Class Loaders In J2EE
J2EE的class loader主要需要考虑热部署和应用独立性(hot redeployment and application independence)。
一般来说,loaders都是通过父子继承关系方式组织的。所以一般的loader都有父loader,要知道loader本身也是class,也需要被load。当一个loader收到一个class装载请求的时候,它会首先请求它的父loader去做,一直向上请求到top loader。如果父loader能做就做,不能做就往下走,一直到底,在找不到就报ClassNotFoundException。注意,父loader装的class看不到子loader装的class。当然兄弟之间也不行。
Tomcat Class Loaders
当Tomcat启动的时候,它创建几个loader,他们的继承关系,如下:
引用
   Bootstrap
          |
       System
          |
       Common
       /     \
  Webapp1   Webapp2 ...

* Bootstrap
这个loader装载JVM提供的基本的运行时类,以及来至$JAVA_HOME/jre/lib/ext的jar文件。
* System
这个loader装载环境变量CLASSPATH下面的类,这些类对tomcat内部类和web app里面的类都可见。但标准的Tomcat 6 startup scripts ($CATALINA_HOME/bin/catalina.sh or %CATALINA_HOME%\bin\catalina.bat) 完全忽略了CLASSPATH下面的类对它的可见性,取而代之的从下面的库里面构建:
     o $CATALINA_HOME/bin/bootstrap.jar - 包含用于初始化Tomcat 6 server的main()方法以及它所依赖的类。
     o $CATALINA_HOME/bin/tomcat-juli.jar - 更名的Jakarta commons logging API和java.util.logging LogManager.
* Common    
这个loader装载一些额外的类,这些类对tomcat内部类和所有web app里面的类都可见。通常app 类不应该放在这里。它包含$CATALINA_HOME/lib下面未打包的类和资源,并且Jar里面的资源也通过这个loader对外可见了。默认情况包括:  
          o annotations-api.jar - JEE annotations classes.
          o catalina.jar - Implementation of the Catalina servlet container portion of Tomcat 6.
          o catalina-ant.jar - Tomcat Catalina Ant tasks.
          o catalina-ha.jar - High availability package.
          o catalina-tribes.jar - Group communication package.
          o el-api.jar - EL 2.1 API.
          o jasper.jar - Jasper 2 Compiler and Runtime.
          o jasper-el.jar - Jasper 2 EL implementation.
          o jasper-jdt.jar - Eclipse JDT 3.2 Java compiler.
          o jsp-api.jar - JSP 2.1 API.
          o servlet-api.jar - Servlet 2.5 API.
          o tomcat-coyote.jar - Tomcat connectors and utility classes.
          o tomcat-dbcp.jar - package renamed database connection pool based on Commons DBCP.
          o tomcat-i18n-**.jar - Optional JARs containing resource bundles for other languages. As default bundles are also included in each individual JAR, they can be safely removed if no internationalization of messages is needed.
* WebappX    
这个loader装载每一个部署在单个Tomcat 6 实例下面的web application。所有/WEB-INF/classes和/WEB-INF/lib下面的类和资源都在本web app内彼此可见。单对别的web app不可见。
源码分析   
private void initClassLoaders() {
try {
commonLoader = createClassLoader("common", null);
if( commonLoader == null ) {
// no config file, default to this loader - we might be in a 'single' env.
commonLoader=this.getClass().getClassLoader();
}
catalinaLoader = createClassLoader("server", commonLoader);
sharedLoader = createClassLoader("shared", commonLoader);
} catch (Throwable t) {
log.error("Class loader creation threw exception", t);
System.exit(1);
}
}

ClassLoader classLoader = ClassLoaderFactory.createClassLoader
(locations, types, parent);

classLoader = new StandardClassLoader(array);

参考:
1.  Tomcat 原理解说:启动过程分析
   http://laiyu.blog.techweb.com.cn/archives/2006/20061228163214.shtml
2. Internals of Java Class Loading
   http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html
3. Understanding J2EE Application Server Class Loading Architectures
   http://www.theserverside.com/tt/articles/article.tss?l=ClassLoading

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-334026-1-1.html 上篇帖子: win2003+Eclipse+Tomcat+Lomboz的配置总结 下篇帖子: 提高Tomcat性能的几个方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表