Tomcat为什么要自定义类加载器

有关打破类加载器双亲委派机制的一个举例:

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

  1. 无法隔离不同web应用的类

    比如两个web应用分别依赖同一个库的不同版本(如 log4j 1.x 和 log4j 2.x)

    若遵循双亲委派:

    1. 父加载器加载 log4j-1.2.17.jar
    2. 应用 2 的类加载器委托父加载器时,发现 Log4j 类已加载,被迫使用旧版本,导致兼容性问题。

    打破双亲委派后:

    1. 应用 2 的 WebApp ClassLoader 优先加载自己的 log4j-2.14.1.jar
    2. 两个应用使用各自版本的 Log4j,互不干扰。
  2. 无法支持热部署

    Web 应用需要在不重启 Tomcat 的情况下重新加载类,但双亲委派模型下,一旦类被父加载器加载,无法卸载和重新加载(如果不重启Tomcat ,父加载器中加载的类时无法变更的)。

    • tomcat内部是使用WebApp ClassLoader,每个web应用都会独立使用一个类加载器

    • 在加载类时,先检查本地缓存,再尝试自己加载,然后才是委派给父加载器

    • 这样在 Web 应用重启时,Tomcat 会销毁旧的 WebApp ClassLoader,并创建新的类加载器重新加载类,旧的类可被 GC 回收,实现热部署。

#java#
fengdongnan的博客 文章被收录于专栏

记录fengdongnan的知识产出文档,欢迎大家来一起交流学习

全部评论
很好的解释
点赞 回复 分享
发布于 03-20 09:41 广东

相关推荐

评论
7
19
分享

创作者周榜

更多
牛客网
牛客企业服务