tomcat 架构解析02-类加载器


类加载时一切java应用运行的基础

J2SE标准类加载器

JVM默认提供了三个类加载器,她们以一种父子树的方式创建,同时使用委派模式,确保应用程序可以通过标准类加载器加载所有java类
**Bootstrap类加载器:**用于记载JVM提供的基础运行类,即位于JAVA_HOME/jre/lib 下的核心类库
Extension类加载器: java 提供的一个标准的扩展机制用于加载除了核心类库外的jar包,即位于扩展目录的jar包,会自动被加载
默认的扩展目录是JAVA_HOME/jre/lib/ext。典型场景是java使用该类加载器加载JVM默认提供但是不属于核心类库的jar包,如JCE等。不推荐将应用程序依赖的jar包放到扩展目录,这样会对所有应用可见 一定程度上也浪费资源。
**System类加载器:**用于加载CLASSPATH下的jar包。通常用于加载应用程序jar包及其启动入口类(tomcat 的Bootstrap类由该类加载)

应用程序不构造自定义类加载器时基本使用System类加载器进行类加载,自定义类加载器时一般也是以System类加载器作为父类。
JVM还提供了一套Endorsed Standards Override Mechanism的机制用于允许替换JCP之外生成的API.通过该机制应用程序可以提供新版本的实现类覆盖JVM的默认实现。
JVM默认的Endorsed目录为 JAVA_HOME/lib/endorsed。只要时复制到该目录的jar包将优先于JVM中的类加载。
并不是所有的核心类库都可以被覆盖,只有一部分,具体参考官方文档。

Tomcat类加载器

一方面出于架构考虑,一方面也是出于servlet规范考虑(每个应用要有单独的类加载器),应用服务器通常自定义类加载器已实现更加灵活的控制。

隔离性: web应用类库要相互隔离,避免依赖库互相影响,
**灵活性:**指针对某一个应用重新部署时不用加载所有应用的类库。
性能: 每个应用都有一个类加载器,web类重新加载时不涉及其他应用的类,速度更快。

tomcat类加载方案
在这里插入图片描述
tomcat也提供了三个基础类加载器和web应用类加载器
Common: 以System类加载器作为父类,是tomcat顶层的公用类加载器,路径为common.loader,默认指向 CATALINA_HOME/lib下的包。负责加载Tomcat应用和Web应用可见的jar包,如Servlet规范包等。
**Catalina:**以Common类加强在其为父类加载器,是用于加载Tomcat应用服务器的类加载器,路径为server.loader,默认为空,使用Common类加载器进行加载。只负责加载tomcat应用类,这些类对web应用不可见。使得web应用和tomcat实现松耦合。
Shared: 以Common类加强在其为父类加载器,是所有web应用类加载器的父类加载器,路径为shared.loader,默认为空个,使用Common类加载器作为web应用类加载器的父类加载器。负责加载web应用共享的类,Tomcat服务器不可见。
**Web应用:**以shared类加载器为父类加载器,加载/WEB-INF/classes目录下未压缩的Class和资源文件以及/WEB-INF/lib下的jar包,该类加载器只对当前应用可见,其他应用不可见。

默认情况下三个基础类加载器都是同一个(Common)但是可以通过配置使三个基础类加载器各自生效。
CATALINA_HOME/bin下的类作为启动入口由System类加载器进行加载。

共享性: 通过common类加载器实现 tomcat应用和web应用的jar包共享,通过shared类加载器实现 web应用间jar包共享。

隔离性: 实现了tomcat服务器和web应用的隔离,以及各个web引用之间的隔离。

默认情况下三个基础类加载器都是Common,这种情况下是通过JVM的安全策略许可实现禁止web应用使用服务器实现类。

web应用类加载器

java默认类加载器的委派逻辑
1 从缓存中加载
2 如果缓存没有,从父类加载器进行加载
3 父类加载器没有则,从当前类加载器进行加载
4 如果都没有抛出异常

tomcat类加载器的委派逻辑有所不同,进行类加载时除了JVM基础类库外,首先尝试通过当前类加载器进行加载,然后才进行委派。Servlet规范相关的API禁止通过web应用类加载器进行加载,因此这些包不要放在web应用中。web应用类加载器默认加载顺序如下:
1 从缓存中加载
2 如果没有 从JVM的Bootstrap类加载器加载
3 如果没有 从当前类加载器进行加载(WEB-INF)
4 如果没有 从父类加载器进行加载,由于父类加载器采用了默认的委派模式,所以加载顺序为System Common Shared

Tomcat 提供了delegate属性用于控制是否启用java委派模式,默认false(不启用),当配置为true时,tomcat使用java默认委派模式,顺序如下:
1 从缓存中加载
2 如果没有 JVMBootstrap类加载器加载
3 如果没有从父类加载器进行加载 System Common Shared
4 如果没有 从当前类加载器进行加载

也可以通过packageTriggerDeny 树形只让某些包路径采用 java委派模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catch that elf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值