tomcat为什么要自定义三个类加载器

tomcat为什么要自定义三个类加载器

在这里插入图片描述

1.tomcat可能要部署多个web项目,多个项目可以依赖同一个类库不同版本jar包,但是不同版本的jar包要进行隔离
2.多个项目不能共享一份jar包的class,不同的项目不能直接共用同一个类加载器

类加载器的特性:

  • 判断一个类是否存在唯一的依据是:包名+类名
  • 对同一个class文件只能加载一次,如果再次搜索到同名的class文件会直接抛出异常(所以不同版本的jar包要进行隔离)
3.避免类加载器的内存泄漏:

如果类加载器发生了内存泄露,那么与它关联的类、缓存状态、配置信息都会发生泄漏,所以进行隔离可以保证其它应用程序的安全

4.服务器本身也有自己依赖的jar包

基于安全考虑,服务器所使用的jar包应该与应用程序的jar包互相独立。服务器本身依赖的类,用自己独有的类加载器去加载,否则,项目中如果使用了一些来源不明、不安全的jar,可能会危及整个服务器

5.多个项目如果依赖同一个类库的相同版本,tomcat提供了一个共享类加载器sharedLoader,解决这个问题
6.热部署:
  • 比较现代的服务器,都具备该功能
  • jsp要经过翻译、编译,然后才变成一个class
  • 类加载器的特性:只要是已加载的类,就不会再加载
  • 热部署的实现思路是:
    jsp的类加载器设计成一次性的,一旦检测到jsp文件发生改变,就会卸载目前的jsp类加载器,
    然后再去创建一个新的jsp类加载器,加载新的jsp的class
在传统的Tomcat部署方式中,默认会由双亲类加载器加载Tomcat的核心类。双亲类加载器是Java虚拟机中的一个重要概念,它采用了双亲委派模型,通过一层一层向上委托的方式来加载类。在这种模型中,首先会尝试由Bootstrap类加载器加载类,如果找不到,再由ExtClassLoader(扩展类加载器)加载,如果还找不到,最后由AppClassLoader(应用类加载器)加载。这样的设计可以保证类的加载是有序的,缓解了不同类之间的命名冲突问题。 然而,在某些特殊的情况下,我们可能需要打破双亲委派模型,自定义加载一些特殊的类。其中一种常见的场景是在应用中使用了一些第三方库,而这些库的版本与Tomcat的核心类库存在冲突,可能需要直接加载特定版本的类。 打破双亲类加载器加载Tomcat的核心类可以通过在启动Tomcat时指定自定义类加载器来实现。具体操作是,在启动脚本或配置文件中增加如下的参数: -Dcatalina.loader=org.apache.catalina.loader.ParallelWebappClassLoader 这样,Tomcat启动时将使用ParallelWebappClassLoader作为类加载器,它可以直接加载WEB-INF/lib目录下的JAR包中的类,而不经过双亲类加载器的委派。 需要注意的是,打破双亲类加载器加载Tomcat的核心类是一种高级配置,需要谨慎使用。对于大多数场景,我们应该依赖Tomcat默认的类加载机制,而避免直接修改Tomcat类加载器配置。只有在特殊情况下才需要考虑自定义加载器。正确的使用类加载机制有助于保证应用的稳定性和兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值