浅议tomcat与classloader

关于tomcat和classloader的文章,网上多如牛毛,且互相转载,所以大多数搜到的基本上是讲到了tomcat中classloader的几个层次,对于初接触classloader,看了之后还是只知其然不知其所以然。

一直比较好奇,为什么tomcat需要实现自己的classloader,jvm提供的classloader有什么不符合需要?

事实上,tomcat之所以造了一堆自己的classloader,大致是出于下面三类目的:

  • 对于各个webapp中的class和lib,需要相互隔离,不能出现一个应用中加载的类库会影响另一个应用的情况;而对于许多应用,需要有共享的lib以便不浪费资源,举个例子,如果webapp1和webapp2都用到了log4j,可以将log4j提到tomcat/lib中,表示所有应用共享此类库,试想如果log4j很大,并且20个应用都分别加载,那实在是没有必要的。
  • 第二个原因则是与jvm一样的安全性问题。使用单独的classloader去装载tomcat自身的类库,以免其他恶意或无意的破坏;
  • 第三个原因是热部署的问题。相信大家一定为tomcat修改文件不用重启就自动重新装载类库而惊叹吧。

本文集中探讨第一个和第三个原因,即tomcat中如何利用classloader做到部分隔离,部分共享的,以及tomcat如何做到热部署的。

首先,我们讨论tomcat中如何做到lib的部分隔离,部分共享的。在Bootstrap中,可以找到如下代码:

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);
        }
    }

应该可以看出来,这里创建了3个classloader,分别是common,server和shared,并且common是server和shared之父。如果感兴趣,可以看下createClassLoader,它会调用进ClassLoaderFactory.createClassLoader,这个工厂方法最后会创建一个StandardClassLoader,StandardClassLoader仅仅继承了URLClassLoader而没有其他更多改动,也就是说上面3个classloader都是StandardClassLoader,除了层次关系之外,他们与jvm定义的classloader并没有区别,这就意味着他们同样遵循双亲委派模型,只要我们能够用它装载指定的类,则它就自然的嵌入到了jvm的classloader体系中去了。Tomcat的classloader体系如图:

时间: 2024-10-05 04:09:41

浅议tomcat与classloader的相关文章

浅谈Tomcat

浅谈Tomcat 随着java的流行,其在web上的应用也越来越广,tomcat作为一个开源的servlet容器,应用前景越来越广,本文将向你讲述tomcat的一些知识. 一:简介tomcat是jakarta项目中的一个重要的子项目,其被JavaWorld杂志的编辑选为2001年度最具创新的java产品(Most Innovative Java Product),同时它又是sun公司官方推荐的servlet和jsp容器(具体可以见http://java.sun.com/products/jsp/

浅议指针

指针--------存储地址的变量 int a=5; int* p=&a; int b=*p; 执行以上操作后,b这个整型变量里的值是多少? 答 : 5 p这个变量里的值是多少? 答 : a的地址(不是int型数字5!) 为什么呢? int a=5; 这是个最常见的定义变量并赋值语句,执行该句后,内存中会分配出一个4个字节(通常为4个字节,具体大小由系统决定)大小的空间,该空间的名字为a,并把数字5赋值到了该空间,并且该空间只能用来存放整型数字,当然该空间会有一个内存地址(每个变量是放在内存中的

【VMware虚拟化解决方案】浅议VMware虚拟化环境下的安全策略

浅议VMware虚拟化环境下的安全策略 刘志勇 通过多年的发展,VMware在虚拟化市场处于领军地位,很多企业部署了VMware虚拟化方案,笔者所在的企业同样也不例外. 经过多年来的信息化建设,出于对安全防护的高度重视,为了物理边界和终端安全,企业部署了安全系统,包含了安全网关.应用防护.防病毒软件等等. 但是,企业在信息化建设大量应用了VMware虚拟化的方案,虽然早先做到了物理边界和终端安全,但虚拟化系统的主机漏洞防护却面临着挑战,本文作者就尝试阐述在VMware虚拟化环境下如何制定安全策略

浅议SNMP安全、SNMP协议、网络管理学习

相关学习资料 tcp-ip详解卷1:协议.pdf(重点看25章SNMP部分) http://www.rfc-editor.org/rfc/rfc1213.txt http://www.rfc-editor.org/rfc/rfc1155.txt http://www.rfc-editor.org/rfc/rfc1157.txt http://network.51cto.com/art/201007/209214.htm http://zh.wikipedia.org/wiki/SNMP http

ClassLoader,Thread.currentThread().setContextClassLoader,tomcat的ClassLoader

实际上,在Java应用中所有程序都运行在线程里,如果在程序中没有手工设置过ClassLoader,对于一般的java类如下两种方法获得的ClassLoader通常都是同一个 this.getClass.getClassLoader(): Thread.currentThread().getContextClassLoader(): 方法一得到的Classloader是静态的,表明类的载入者是谁: 方法二得到的Classloader是动态的,谁执行(某个线程),就是那个执行者的Classloade

浅谈tomcat中间件的优化【转】

今天来总结一下tomcat的一些优化的方案,由于本人才疏学浅,写的不好,勿喷! tomcat对于大多数从事开发工作的童鞋应该不会很陌生,通常做为默认的开发环境来为大家服务,不过tomcat默认的一些配置对于生产环境来说是相当不够滴,特别对于内存以及线程的配置方面都很有可能成为日后性能的瓶颈. 接下来咱们就聊聊tomcat的优化,从内存以及线程两个方面来谈: 1.内存方面 tomcat的内存优化操作起来就比较简单了 如果是linux环境的话设置如下: 修改TOMCAT_HOME/bin/catal

[Tomcat] Tomcat的classloader

Tomcat Classloader JVM Classloader 首先,你需要了解一下JVM的Classloader机制(详细请自行google之).简而言之,JVM的classloader加载继承关系分为BootstarpClassLoader --> ExtClassLoader --> SystemClassLoader,应用的WebAppClassLoader继承自SystemClassLoader,在加载具体某个类时,一般会先委托给父类ClassLoader,当父类ClassLo

浅谈Tomcat和Servlet

本文浅谈下对Tomcat和Servlet总体的理解,初学时有用过一段时间,但当时疲于应对如何xml配置和使用,对他们的理解就像是一个黑匣子.现在回顾一下帮助自己加深网络的理解.开始还是先推荐我看的文章和书. https://www.cnblogs.com/zhouyuqin/p/5143121.html 以下都是IBM Developer上的文章,该网站上还是有很多优质文章. https://www.ibm.com/developerworks/cn/java/j-lo-servlet/  Se

浅谈tomcat的配置

1.如何修改tomcat的端口 在某些情况下,可能需要修改tomcat监听的端口8080,比如: a.需要启动两份tomcat服务器 b.某个服务占用了8080端口(1433,1521,3306...) Windows查看端口使用命令:netstat -an 修改tomcat端口的方法: 修改~tommcat/conf/server.xml文件中port="8080"数据将8080修改成你需要的端口号即可. 端口号范围:1-65535(实际上里面的有些端口已经被使用),一般情况下1-1