`
朱秋旭
  • 浏览: 231024 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

为什么tomcat要自定义classloader

阅读更多

一、 提起tomcat 中的classloader 莫过于经典的委托机制,上图:


                                                
 

不过这个流传于世间的大图为tomcat5的classloader模型,对于目前比较主流的,支持nio 的tomcat7而言,classloader结构也不一样,tomcat7中的classloader委托模型:


                                                         

 

二、研究tomcat的类加载器结构之前,我们先来关注一下JVM中的classloader机制:

jvm中默认定了三种classloader,分别为:bootstrap classloader, extension classloader, system classloader.

bootstrap 使用c语言来实现,没有对应的ClassLoader对象。

该方法String.class.getClassLoader() 返回null。

extension 用于从jre/lib/ext 目录加载“标准的扩展”。

system 用于加载应用类。由classpath环境变量中的 jar/zip 文件。

 

除此之外,java的classloader采用委托机制,即classloader都有一个 parent classloader。当收到一个类加载请求时,会先请求parent classloader加载类,如果parent classloader家在不到,再由自身尝试加载(如果加载不到,throw ClassNotFountException). 这种机制主要是出于安全考虑,如果用户自定义一个java.lang.Object 不至于覆盖jdk中的Object。

当然万事万物无绝对。OSGI就违反了这个原则。

 

三、那么Tomcat为什么要自定义ClassLoader呢?

我认为主要出于两方面原因:

1 Servlet规范中对于类加载器的要求



 

2 实现不同web app 的类隔离。

 

各个classloader作用说明:

1  bootstrap / extension: 加载$JAVA_HOME/jre/lib/ext下的类

2  system: 加载由CLASSPATH初始化的所有类,对于tomcat自身类以及所有web应用的类可见。但是查看tomcat标准的启动脚本$CATALINA_HOME/bin/catalina.bat, 完全无视CLASSPATH,直接加载tomcat中的3个jar包。

3  Common: 对于tomcat,和所有web app 可见,用于加载$CATALINA_BASE/conf/catalina.properties里面的类,通常应用程序的类不建议放在里面。默认加载:

 

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar

 

4  WebappX: 加载所有WEB-INF/classes下面的类以及里面的jar。

该classloader有意违背了委托原则。它首先看WEB-INF/classes中是否有请求的类,而不是委托parent classloader去处理,但是jre 和servlet api 不会被覆盖。

以上就是对于tomcat 中的classloader的简单总结介绍。

 参考tomcat官方资料: http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html

  • 大小: 41.8 KB
  • 大小: 1.2 KB
  • 大小: 22.2 KB
3
3
分享到:
评论
6 楼 永志_爱戴 2014-08-15  
kuchaguangjie 写道
楼下 瞎扯淡 也有人崇拜 ... 去看看 jvm 的 security 吧.

你是说我瞎扯淡吗?你可以自己看看tomcat的WebappClassLoader源码。对于你说的jvm security,是在system加载不到类时才通过securityManager去检查要加载的类是否受限制。因为我主要针对类的加载流程,所以没提这一点。希望能说清楚我哪个地方是在扯淡,有错误的地方还望指出来.
5 楼 kuchaguangjie 2014-08-14  
楼下 瞎扯淡 也有人崇拜 ... 去看看 jvm 的 security 吧.
4 楼 kuchaguangjie 2014-08-14  
这是 jvm security 的第一关,
3 楼 永志_爱戴 2014-08-14  
还有一个JsperLoader的加载器没有说
2 楼 永志_爱戴 2014-08-14  
webappclasslaoder虽然有意违背了委托原则,但他不是首先看web-inf/classes中是否有请求的类。而是先看看缓存的类中是否已经有,如果没有再调用system去加载,如果加载不到,再根据是否设置了委托选择是自身加载还是委托给父类。
1 楼 hzieept 2014-08-14  
最实用的目的是支持jsp热部署。这是tomcat的一个特点。

相关推荐

    3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4

    3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4

    Tomcat 5.0.18 ClassLoader source code insight

    Tomcat的ClassLoader设计尤为独特,它不仅需要处理Web应用程序中的类加载,还需要处理容器自身的类加载,这就使得Tomcat的ClassLoader比标准Java ClassLoader更为复杂。 Tomcat 5.0.18的ClassLoader设计主要分为...

    tomcat 类加载机制 —— ClassLoader

    在Tomcat中,我们可以通过配置`catalina.properties`文件和`server.xml`文件来调整类加载策略,例如设置自定义的类加载顺序或启用共享类加载器。 此外,Tomcat还支持热部署,即在不重启服务器的情况下更新Web应用的...

    tomcat类加载器

    这个"DevLoader.zip"文件可能包含与Tomcat自定义类加载器相关的资料,特别是名为"DevLoader"的类加载器,这可能是Tomcat为开发者提供的一种特殊加载器。 首先,我们来理解一下类加载器的基本概念。在Java中,类加载...

    Tomcat:apache-tomcat-6.0.18

    5. **ClassLoader机制**:Tomcat使用自定义的ClassLoader来加载Web应用程序的类,确保不同应用之间的类隔离,防止冲突。 Tomcat 6.0.18版的特性包括: 1. **性能优化**:相对于之前的版本,6.0.18进行了性能调优,...

    Tomcat.ClassLoader.rar_Java编程_Java_

    Tomcat使用自定义的ClassLoader,即Catalina ClassLoader,来实现这一目标。每个Web应用都有自己的ClassLoader,这样可以确保一个应用的类不会与另一个应用的类混淆。此外,Tomcat还引入了Webapp ClassLoader,它...

    tomcat-8.0.50.zip

    5. **ClassLoader**:Tomcat使用自定义的ClassLoader来加载Web应用程序的类,这使得不同的应用程序可以使用相同的库而不会相互冲突。 6. **部署与管理**:可以通过修改conf/server.xml和conf/context.xml文件,或者...

    TOMCAT源代码,包括转载得别人的分析

    Tomcat使用自定义的ClassLoader来加载Web应用的类,每个Web应用都有自己的独立ClassLoader,这种设计确保了应用间的类隔离,避免了类冲突。 5. **JNDI服务**: Tomcat提供JNDI(Java Naming and Directory ...

    tomcat8源码

    Tomcat使用自定义的ClassLoader来加载Web应用的类,这使得每个应用可以有自己的类空间,避免类冲突。Classloading策略是理解和调试Tomcat应用的重要部分。 7. **Session管理** Tomcat提供了会话管理机制,包括...

    apache-tomcat-7.0.40-src

    源码中包含了自定义ClassLoader的实现。 6. **配置文件解析**:Tomcat使用XML配置文件来定义其行为,如server.xml、context.xml等。源码展示了如何解析和应用这些配置。 7. **安全管理**:Tomcat支持多种安全模型...

    tomcat 6 源码

    5. **ClassLoader**:Tomcat使用自定义的ClassLoader来加载Web应用的类。这使得不同应用之间能隔离地运行,避免类冲突。 6. **Lifecycle**:所有Tomcat组件都遵循生命周期接口,如`org.apache.catalina.Lifecycle`...

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

    - **Valve**:Valve是容器级别的扩展点,可以通过配置文件添加自定义逻辑到Tomcat的处理流程中。 ### 三、Tomcat内部机制 #### 3.1 启动过程 当启动Tomcat时,其核心组件会按照一定的顺序初始化并准备就绪: 1. *...

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

    9. **错误处理与日志系统**:Tomcat使用自定义的日志框架,源码中`logging`目录下的类定义了如何记录和处理错误信息。 10. **网络编程**:Tomcat底层使用NIO(非阻塞I/O)和BIO(阻塞I/O)模型,这在`java/org/...

    细说Tomcat如何打破双亲委派(有源码和图)

    Tomcat的类加载机制可以概括为以下几点: 1. **WebAppClassLoaders**: 每个Web应用都有自己的WebAppClassLoader,用于加载应用中的类。这是打破双亲委派模型的关键,因为WebAppClassLoader会优先尝试加载应用自己的...

    tomcat启动原理解析

    - Tomcat使用自定义的类加载器,如`CommonClassLoader`、`CatalinaClassLoader`等,它们按照特定的层次结构加载类。 5. **初始化容器** - `Catalina`类是Tomcat的主要组件,负责管理所有Web应用。在启动过程中,...

    tomcat6工具

    5. ClassLoader机制:理解Classpath的加载顺序和自定义ClassLoader的使用,能有效解决类冲突问题。 四、Tomcat6性能调优 1. 线程池设置:调整最大线程数和最小线程数,避免资源浪费和线程阻塞。 2. JVM内存配置:...

    apache-tomcat-8.5.32.zip

    6. **ClassLoader**:Tomcat使用自定义的类加载器来管理Web应用程序的类路径,确保每个应用程序都有自己的类加载环境。 7. **Logging**:Tomcat提供了日志记录服务,允许开发者调试和监控应用程序。 安全方面: ...

Global site tag (gtag.js) - Google Analytics