`
JackyCheng2007
  • 浏览: 253947 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Tomcat 6 启动过程分析 (7) - ClassLoader

阅读更多
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
分享到:
评论

相关推荐

    tomcat启动原理解析

    **Tomcat启动原理解析** Tomcat作为一款广泛使用的开源Java应用服务器,其启动过程涉及了众多关键步骤和组件的协同工作。理解Tomcat的启动原理对于开发者来说至关重要,不仅有助于提升性能优化的能力,还能在遇到...

    tomcat7启动或运行报错

    在使用Tomcat7部署Web应用的过程中,可能会遇到启动或者运行时出现以下错误提示: ``` java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl ...

    apache-tomcat-7.0.81-src 源码免费下载

    4. **生命周期管理**:在`common`和`shared`目录中,可以看到Tomcat如何管理和控制各个组件的生命周期,包括启动、停止、初始化和销毁等过程。 5. **配置管理**:Tomcat的配置文件通常位于`conf`目录下,源码解析...

    Tomcat 5.0.18 ClassLoader source code insight

    通过对Tomcat 5.0.18 ClassLoader的源码分析,我们可以更好地理解和控制应用的类加载行为,这对于解决类冲突、优化性能和提高安全性都至关重要。在实际开发中,理解这些细节可以帮助我们更高效地部署和调试Java Web...

    tomcat 学习与分析总结资料

    1. **Tomcat启动脚本catalina** Tomcat的启动脚本`catalina.sh/bat`是服务器运行的关键。这个脚本负责配置环境变量、初始化Java选项,并启动或关闭Tomcat服务器。通过研究这个脚本,我们可以了解如何配置JVM参数,...

    tomcat-4.1.40-src

    3. **启动流程**:Tomcat的启动过程始于`bin/catalina.sh`或`catalina.bat`,这些脚本会初始化Java环境,并加载`catalina.jar`中的`org.apache.catalina.startup.ClassLoader`,接着加载`Server`对象,初始化`...

    Tomcat 原理解说

    Tomcat 启动过程分析 Tomcat 的启动主要涉及以下几个步骤: 1. **启动命令行参数**:通常通过执行`startup.bat`或`startup.sh`脚本来启动Tomcat。这些脚本设置JVM的环境变量,如`catalina.base`和`catalina.home`...

    Tomcat7核心架构

    在启动过程中,Tomcat首先进行必要的初始化工作,包括建立类加载器(ClassLoader)以及构建用于解析配置文件的**Digester XML解析器**。 - **建立ClassLoader** - 类加载器由`lib`目录下的多个jar包组成。 - 主要...

    《深入剖析 Tomcat》PDF版本下载.txt

    #### 3.1 启动过程 当启动Tomcat时,其核心组件会按照一定的顺序初始化并准备就绪: 1. **Bootstrap ClassLoader**加载Bootstrap类库; 2. **Catalina ClassLoader**加载Tomcat核心类库; 3. **Common ClassLoader*...

    tomcat8源码的maven项目

    2. **理解生命周期管理**:Tomcat使用生命周期接口来管理组件的初始化、启动、停止和销毁过程。 3. **学习部署和加载机制**:Tomcat如何加载和管理Web应用程序,包括WAR文件的部署和Classloader的工作原理。 4. **...

    tomcat加载jar异常问题的分析与解决

    6. 对于更复杂的情况,可能需要深入Tomcat的源码来分析其加载JAR包的内部机制。在本例中,可以看到异常信息中提到了JasperInitializer和TldScanner,这暗示了Tomcat的Jasper编译器和Taglib扫描器在扫描类路径时未能...

    面试必问之jvm与性能优化.docx

    - **System ClassLoader**:加载Tomcat启动的类。 - **Common ClassLoader**:加载Tomcat使用以及应用通用的一些类。 - **WebApp ClassLoader**:每个部署的应用程序都会创建一个唯一的类加载器来加载应用相关的类。...

    weblogic部署项目jar冲突解决

    7. **分析类加载顺序**:通过WebLogic的日志或工具,如`jarscan`,可以分析类加载顺序,找出冲突的根源。 8. **使用Maven或Gradle的依赖管理**:通过构建工具的依赖管理功能,可以更有效地控制应用的依赖关系,防止...

    学习Java语言的30个参考,让你坐拥别人之上的30个擦考

    - **类加载器体系结构**:认识Bootstrap ClassLoader、Extension ClassLoader、Application ClassLoader的区别和作用。 - **类的生命周期管理**:掌握类的卸载条件和时机。 ### 4. GUI开发 - **Applet基础知识**:...

    JAVA虚拟机的类装载机制的原理分析与应用研究.pdf

    Java虚拟机(JVM)是Java程序运行的核心,它的类装载机制是理解Java应用程序如何启动、运行和管理的关键。本文将深入探讨Java虚拟机的类装载机制,包括其原理、工作流程以及在实际开发中的应用。 类装载机制是Java...

    Java进阶路线

    - **Bootstrap ClassLoader**:启动类加载器,加载核心类库。 - **Extension ClassLoader**:扩展类加载器,加载扩展库。 - **System ClassLoader**:系统类加载器,加载应用类库。 #### 八、垃圾回收 垃圾回收(GC...

    JAVA面试题总览[整理].pdf

    6. 内存溢出排查通常查看堆转储文件,分析对象分配、内存泄漏等情况。 7. JVM内存模型包括主内存和工作内存,重排序、内存屏障和happen-before原则保证内存一致性。 8. 类加载器负责加载类到JVM,包括启动类加载器...

    跳槽涨薪涨薪必备精选面试题.pdf

    SpringBoot启动Tomcat通常通过`SpringApplication.run()`方法,自动配置并启动。 SpringBoot配置文件加载顺序是:`application.properties`或`application.yml`,然后是环境特定的配置。 Mybatis的优点是灵活的SQL...

    Java学习思路.pdf

    Java的类加载器(ClassLoader)会按照双亲委派模型来加载类,它包括启动类加载器、扩展类加载器和应用类加载器。在学习中也需要掌握Java反射机制,它允许在运行时分析和操作类和对象。 Java SE 6.0、Java SE 7.0、...

Global site tag (gtag.js) - Google Analytics