首页 > 其他分享 >Tomcat类加载

Tomcat类加载

时间:2023-03-19 20:46:06浏览次数:29  
标签:Web Tomcat SharedClassLoader WebAppClassLoader 应用 加载

tomcat如何实现,应用隔离类加载?

org.apache.catalina.loader.WebappClassLoaderBase#loadClass(java.lang.String, boolean) (1)先在本地缓存中查找是否已经加载过该类(对于一些已经加载了的类,会被缓存在resourceEntries这个数据结构中),如果已经加载即返回,否则 继续下一步。 (2)让系统类加载器(AppClassLoader)尝试加载该类,主要是为了防止一些基础类会被web中的类覆盖,如果加载到即返回,返回继续。 (3)前两步均没加载到目标类,那么web应用的类加载器WebAppClassLoader将自行加载,如果加载到则返回,否则继续下一步。 (4)最后还是加载不到的话,则委托父类加载器(Common ClassLoader)去加载。 违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给commonClassLoader走双亲委托。 WebappClassLoaderBase#findClass
  1. 首先尝试在自己应用目录下查找要加载的类
  2. 没有找到,交给父加载器查找
CommonClassLoader、CatalinaClassLoader、SharedClassLoader、WebAppClassLoader是Tomcat自定义的类加载器,它们分别加载/common/*、/server/*、/shared/*、/WEB-INF/*中的类库 对于Tomcat的6.x版本,只有指定了tomcat/conf/catalina.properties配置文件的server.loader和shared.loader项后才会真正建立CatalinaClassLoader和SharedClassLoader的实例,否则会用到这两个类的地方都会用CommonClassLoader的实例代替,而默认的配置文件中没有设置这两个项。所以Tomcat6.x顺理成章地把/common、/shared和/server三个目录合并成了一个/lib目录,这个目录里的类库相当于以前的/common目录中类库的作用。这是Tomcat设计团队为了简化大多数的部署场景所做的一项改进,如果默认的设置不能满足需求,用户可以通过修改配置文件指定server.loader和shared.loader的方式重新启动Tomcat5.x的类加载器架构。

1. WebAppClassLoader

Tomcat 的解决方案是自定义一个类加载器 WebAppClassLoader, 并且给每个 Web 应用创建一个类加载器实例。我们知道,Context 容器组件对应一个 Web 应用,因此,每个 Context容器负责创建和维护一个 WebAppClassLoader加载器实例。这背后的原理是,不同的加载器实例加载的类被认为是不同的类,即使它们的类名相同。这就相当于在 Java 虚拟机内部创建了一个个相互隔离的 Java 类空间,每一个 Web 应用都有自己的类空间,Web 应用之间通过各自的类加载器互相隔离。

2.SharedClassLoader

本质需求是两个 Web 应用之间怎么共享库类,并且不能重复加载相同的类。在双亲委托机制里,各个子加载器都可以通过父加载器去加载类,那么把需要共享的类放到父加载器的加载路径下不就行了吗。 因此 Tomcat 的设计者又加了一个类加载器 SharedClassLoader,作为 WebAppClassLoader的父加载器,专门来加载 Web 应用之间共享的类。如果 WebAppClassLoader自己没有加载到某个类,就会委托父加载器 SharedClassLoader去加载这个类,SharedClassLoader会在指定目录下加载共享类,之后返回给 WebAppClassLoader,这样共享的问题就解决了。

3. CatalinaClassloader

如何隔离 Tomcat 本身的类和 Web 应用的类? 要共享可以通过父子关系,要隔离那就需要兄弟关系了。兄弟关系就是指两个类加载器是平行的,它们可能拥有同一个父加载器,基于此 Tomcat 又设计一个类加载器 CatalinaClassloader,专门来加载 Tomcat 自身的类。 这样设计有个问题,那 Tomcat 和各 Web 应用之间需要共享一些类时该怎么办呢?

4. CommonClassLoader

老办法,还是再增加一个 CommonClassLoader,作为 CatalinaClassloader和 SharedClassLoader的父加载器。CommonClassLoader能加载的类都可以被 CatalinaClassLoader和 SharedClassLoader使用。

 

 

 

 

 

 

 

   

标签:Web,Tomcat,SharedClassLoader,WebAppClassLoader,应用,加载
From: https://www.cnblogs.com/zhengbiyu/p/17234189.html

相关文章

  • Tomcat 入门实战(2)--Tomcat Native Library 使用
     本文主要介绍 TomcatNativeLibrary安装及使用,文中所使用到的软件版本:Centos7.9.2009、Java1.8.0_321、Tomcat8.5.84、APR1.7.0。1、APR1.1、APR简介APR(Apac......
  • Nginx与Tomcat作为前端服务器的性能比较
    Nginx与Tomcat作为前端服务器的性能比较摘要最近总遇到使用tomcat还是使用nginx进行前端文件访问的争论想着出差周末在酒店,可以自己进行一下简单的测试.希望能够对......
  • webpack性能优化(1):分隔/分包/异步加载+组件与路由懒加载
    webpackensure相信大家都听过。有人称它为异步加载,也有人说做代码切割,那这个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的,然后使用这个模块的时......
  • vue2升级vue3:vue-i18n国际化异步按需加载
    vue2异步加载之前说过,vue3还是之前的方法,只是把 i18n.setLocaleMessage改为i18n.global.setLocaleMessage但是本文还是详细说一遍:为什么需要异步加载语言包主要还是缩......
  • React 实现 动态加载组件
    React实现动态加载组件import{Button}from'antd'importReact,{useState,lazy,Suspense}from'react'//这个地方动态加载组件constItem=lazy(()=>i......
  • Tomcat监控原理cmdline-jmxclient-0.10.3.jar源码解析
    【摘要】cmdline-jmxclient-0.10.3.jar是一个开源jar包,在zabbix3.0中常用于测试的一个工具,可以用来测试jmx是否配置正确。在监控方面后还可以对Tomcat各种属性进行监控。......
  • tomcat配置时没有工件(artifacts)war选项
    tomcat配置时没有工件(artifacts)war选项可能是maven配置文件porm.xml没配置好在porm.xml文件中添加<packaging>war</packaging>后刷新maven再配置tomcat出现artif......
  • 让你用Undertow你不听,非用Tomcat,性能对比来了!
    在今天的互联网应用开发中,对于Web应用服务器的选择,往往是影响应用性能的重要因素之一。常见的Web应用服务器有很多,其中,Tomcat和Undertow是比较常用的两个Web应用服务器,它们......
  • java类加载器有哪些
    java类加载器有:1、引导类加载器;2、拓展类加载器;3、系统类加载器;4、用户自定义类加载器。其中,引导类加载器(BoostrapClassLoader),又叫启动类加载器,由原生代码(如C语言)编写,不......
  • java类加载器有哪些
    java类加载器有:1、引导类加载器;2、拓展类加载器;3、系统类加载器;4、用户自定义类加载器。其中,引导类加载器(BoostrapClassLoader),又叫启动类加载器,由原生代码(如C语言)编写,不......