`
gotothework
  • 浏览: 82697 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
最近访客 更多访客>>
社区版块
存档分类
最新评论

Tomcat ClassLoader工作原理

阅读更多
每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类
系统默认的contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类
可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader,来改变其载入类的行为
ClassLoader被组织成树形,一般的工作原理是:
1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类
2) contextClassLoader请求它的父ClassLoader来完成该载入请求
3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入
注意:WebApp?ClassLoader的工作原理和上述有少许不同:
它先试图自己载入类(在ContextBase?/WEB-INF/...中载入类),如果无法载入,再请求父ClassLoader完成
由此可得:
- 对于WEB APP线程,它的contextClassLoader是WebApp?ClassLoader
- 对于Tomcat Server线程,它的contextClassLoader是CatalinaClassLoader
3 类的查找
ClassLoader类中loadClass方法为缺省实现,用下面的顺序查找类:
1、调用findLoadedClass方法来检查是否已经被加载。如果没有则继续下面的步骤。
2、如果当前类装载器有一个指定的委托父装载器,则用委托父装载器的loadClass方法加载类,也就是委托给父装载器加载相应的类。
3、如果这个类装载器的委托层级体系没有一个类装载器加载该类,则使用类装载器定位类的特定实现机制,调用findClass方法来查找类。
4 - 部分原代码分析
4.1 - org/apache/catalina/startup/Bootstrap.java
Bootstrap中定义了三个classloader:commonLoader,catalinaLoader,sharedLoader.三者关系如下:
//注意三个自己定置的ClassLoader的层次关系: 
            // systemClassLoader (root) 
            //   +--- commonLoader 
            //          +--- catalinaLoader 
            //          +--- sharedLoader
Tomcat Server线程的起点
构造ClassLoader树,通过Thread.currentThread().setContextClassLoader(catalinaLoader)设置当前的classloader为catalinaLoader。
载入若干类,然后转入org.apache.catalina.startup.Catalina类中
4.2 org.apache.catalina.loader.StandardClassLoader.java
通过看loadClass这个方法来看tomcat是如何加载类的,顺序如下:
(0) Check our previously loaded class cache查找已经装载的class
        clazz = findLoadedClass(name);
(1) If a system class, use system class loader通过系统classloader来装载class
        ClassLoader loader = system;
            clazz = loader.loadClass(name);
(2) Delegate to our parent if requested如果有代理则使用父类classloader
            ClassLoader loader = parent;
            if (loader == null)
                loader = system;
            clazz = loader.loadClass(name);
(3) Search local repositories 查找本地类池,比如$CATALINA_HOME/server
           clazz = findClass(name);
(4) Delegate to parent unconditionally 默认使用代理装载器
[查看代码]
4.3 - org/apache/catalina/startup/ClassLoaderFactory.java
根据设置创建并返回StandardClassLoader的实例
[查看代码]
4.4 - org/apache/catalina/loader/StandardClassLoader.java
类载入器
4.5 - org/apache/catalina/startup/SecurityClassLoad.java
该类仅包含一个静态方法,用来为catalinaLoader载入一些类

*在一个JVM中可能存在多个ClassLoader,每个ClassLoader拥有自己的NameSpace。一个ClassLoader只能拥有一个class对象类型的实例,但是不同的ClassLoader可能拥有相同的class对象实例,这时可能产生致命的问题。如ClassLoaderA,装载了类A的类型实例A1,而ClassLoaderB,也装载了类A的对象实例A2。逻辑上讲A1=A2,但是由于A1和A2来自于不同的ClassLoader,它们实际上是完全不同的,如果A中定义了一个静态变量c,则c在不同的ClassLoader中的值是不同的。
分享到:
评论
2 楼 myeclipse8868 2013-04-07  
好文章,顶起一个
1 楼 maliang.scut 2010-03-15  
哦,拜读了。
也就是说,如果同一个Tomcat下有两个不同的web应用,这两个应用都在自己的lib目录下使用同样的第三方jar包。那么Tomcat会使用不同的Web应用级别的classLoader来加载这两个jar包。
这样就造成了Perm空间的浪费。

一个新的疑问,我在Windows下查看某个web应用的lib目录,大小为12M,那么当这些jar文件都被完全加载后,他们在Perm中会占用多大的空间呢?

相关推荐

    Tomcat中JNDI原理

    本文将深入解析Tomcat 5.0中JNDI的工作原理,特别是`ContextBinding`机制。 #### 二、JNDI与Tomcat ##### 2.1 JNDI概述 JNDI提供了一种查找和定位应用程序所用资源的标准化方式,这些资源包括数据库连接、消息...

    Tomcat 5.0.18 ClassLoader source code insight

    下面,我们将详细探讨Tomcat 5.0.18版本中的ClassLoader工作原理。 首先,ClassLoaders在Java中起着至关重要的作用,它们负责查找和加载类到JVM中。Tomcat的ClassLoader设计独特,因为它需要处理Web应用程序的隔离...

    Tomcat研究之ClassLoader.pdf

    在深入了解Tomcat的工作原理时,一个重要的组成部分就是其ClassLoader机制。本文旨在深入剖析Tomcat中特有的类加载器(ClassLoader)体系结构,帮助读者理解Tomcat如何管理和加载不同类型的类库。 #### 二、Tomcat...

    tomcat工作原理-组件

    **Tomcat工作原理详解——组件解析** Tomcat作为Apache软件基金会的开源项目,是Java Servlet、JavaServer Pages(JSP)和Java Expression Language(EL)的实现,是Web应用程序服务器的首选之一。深入理解Tomcat的...

    tomcat启动原理解析

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

    Tomcat 原理解说

    【Tomcat 原理解说】 Tomcat 是一个流行的开源Java Servlet容器,它实现了Java EE中的Web应用程序...通过深入学习Tomcat的工作原理,开发者能够更好地调试和维护他们的Web应用程序,提高整体的开发效率和产品质量。

    Tomcat:apache-tomcat-6.0.18

    通过源代码,我们可以深入理解Tomcat的工作原理,进行定制化开发或调试。源码包含了以下几个主要部分: 1. **Catalina**:这是Tomcat的核心组件,实现了Servlet和JSP容器的功能。 2. ** Coyote**:处理HTTP连接的...

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

    本资料旨在帮助读者深入了解Tomcat的工作原理及其内部机制。 ### 一、Tomcat简介 Apache Tomcat是一款免费的开源Web服务器软件,主要用于支持Java Servlet、JavaServer Pages (JSP)技术以及部分Web服务标准规范。...

    Tomcat.ClassLoader.rar_Java编程_Java_

    本资料“Tomcat.ClassLoader.rar”聚焦于Java的类加载器(Class Loader)以及它在Tomcat容器中的工作原理,这对于理解和优化Java应用程序的性能至关重要。 首先,让我们深入了解Java ClassLoader。在Java中,...

    tomcat 学习与分析总结资料

    2. **Tomcat工作原理** Tomcat基于Coyote和Apr(Apache Portable Runtime)处理HTTP请求。Coyote是Tomcat的HTTP引擎,负责接收和响应网络请求。Apr则提供了一种高性能的本地接口,提高了网络通信效率。理解Tomcat的...

    apache-tomcat-7.0.40-src

    这个版本的源码包,"apache-tomcat-7.0.40-src",为开发者提供了深入理解Tomcat内部工作原理的机会,同时也是一个学习和优化服务器性能的宝贵资源。以下是关于Apache Tomcat 7.0.40源码的一些关键知识点: 1. **...

    apache-tomcat-源码-lib包

    在"apache-tomcat-源码-lib包"中,我们可以深入理解Tomcat的工作原理以及与Servlet相关的库函数。 1. **Java Servlet**:Servlet是Java平台上的一个标准接口,允许开发人员编写服务器端代码来处理HTTP请求。在...

    Tomcat 热部署的实现原理详解

    首先,对于Java的类加载器(Classloader),其设计遵循“双亲委派模型”,但当涉及到热部署时,Tomcat使用了一种特殊的方式。在Tomcat中,每个Web应用都有自己的类加载器(WebappClassLoader),这个类加载器负责...

    tomcat源码学习

    这本书的推荐表明,作者认为它对于理解Tomcat的工作原理非常有帮助,是深入学习的好资料。 【标签】"源码"和"tomcat8"提示我们,我们将关注的是Tomcat 8版本的源代码。Tomcat 8是一个重要的版本,引入了Java EE 7的...

Global site tag (gtag.js) - Google Analytics