专栏首页强仔仔Tomcat8类加载机制

Tomcat8类加载机制

在了解类加载机制时,发现网上大部分文章还停留在tomcat6,甚至tomcat5。

Tomcat8 和 Tomcat6比较大的区别是 :

  1. Tomcat8可以通过配置 <Loader delegate="true"/>不打破双亲委托
  2. 类的加载顺序略不同

概述

在 Java 环境中,类加载器的布局结构是一种父子树的形式。通常,类加载器被请求加载一个特定的类或资源时,它会先把这一请求委托给它的父类加载器,只有(一个或多个)父类加载器无法找到请求的类或资源时,它才开始查看自身的仓库。

Web应用程序类加载器的模型与此略有不同,如下所述,但主要原则是相同的。


类加载器定义

Bootstrap

加载JVM启动所需的类和系统扩展目录($JAVA_HOME/jre/lib/ext)里 JAR 文件中的类

System

加载tomcat启动的类

Common

加载对Tomcat内部类和所有Web应用程序都可见的其他类 所有应用共享 JAR文件 $CATALINA_HOME/lib JAR文件 $CATALINA_BASE/lib

WebappX

为部署在单个Tomcat实例中的每个Web应用程序创建一个类加载器 加载WEB-INF/classes和WEB-INF/lib的jar中的类 应用私有

查找顺序

  Bootstrap
      |
   System
      |
   Common
   /     \
Webapp1   Webapp2 ...

Tomcat打破了双亲委派顺序

当某个请求想从 Web 应用的 WebappX 类加载器中加载类时,该类加载器会先查看自己的仓库,而不是预先进行委托处理

Tomcat8

  • JVM 的 Bootstrap 类
  • Web 应用的 /WEB-INF/classes 类
  • Web 应用的 /WEB-INF/lib/.jar 类*
  • System 类加载器的类
  • Common 类加载器的类

例:

在 /WEB-INF/classes中有一个应用内部自定义的FileUpload类, Common 中也有一个共享的FileUpload类。

Tomcat8加载顺序:

  • 在加载时,先不进行委托,则每个应用会加载自己的类(2/3 Web加载器
  • 加载不到时委托到再上层Common,Common再委托至System,
  • 4 System加载到就返回,加载不到再让Common处理
  • 5 Common加载到就返回,加载不到抛出异常

问题:

顺序1哪去了?为什么不再委托至Bootstrap 呢?

主要是为了防止一些基础类会被web中的类覆盖

如果web自定义一个Object类呢?首先查找web加载器,就会出问题了。

所以在加载时最先交给Bootstrap加载器加载。

遵循双亲委托

如果 Web 应用类加载器配置有 <Loader delegate="true"/>,表示遵从双亲委托机制,同JVM,则加载顺序变为:

  • JVM 的 Bootstrap 类
  • System 类加载器的类
  • Common 类加载器的类
  • Web 应用的 /WEB-INF/classes 类
  • Web 应用的 /WEB-INF/lib/*.jar 类

例:

在 /WEB-INF/classes中有一个应用内部自定义的FileUpload类, Common 中也有一个共享的FileUpload类,

顺序:

严格按照双亲委派模型进行

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MongodbGFS存储大文件(java版)

    Mongodb 是一个开源的no-sql分布式数据库,Mongodb也为我们提供了基于文件的GFS分布式存储系统。因此利用Mongodb我们完全可以实现一个分...

    林老师带你学编程
  • JAVA API调用elasticsearch实现基本增删改查

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    林老师带你学编程
  • 【面试题】SpringCloud架构中如何保证定时任务只在一个服务在执行

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    林老师带你学编程
  • 虚拟机类加载机制(3)——线程上下文类加载器

    之所以将线程上下文类加载器(Thread Context ClassLoader)单独拿出来写,确实是因为它涉及的东西比较多,既然带有线程两个字,一定也是非常重...

    用户1148394
  • 1.2 双亲委派机制及其原理

    参考博客: https://www.cnblogs.com/ITPower/p/13197220.html

    用户7798898
  • Java虚拟机的类加载机制及双亲委派模型

    所谓双亲委派就是类加载器在加载一个类的时候会先委托它的父类尝试去加载,父类又会委托父类尝试去加载。如果父类加载不了子类再自己加载,这样可以保证相同类型的类他们的...

    诺浅
  • 图解Tomcat类加载机制

      说到本篇的tomcat类加载机制,不得不说翻译学习tomcat的初衷。   之前实习的时候学习javaMelody的源码,但是它是一个Maven的项目,...

    用户1154259
  • 从微信、钉钉等APP,看六种常见的loading 加载设计

    当页面的框架固定时,只需要加载框架内数据时,采用这种刷新样式,即先加载框架,再加载框架内的数据。为了反之框架内的内容为空,会用占位符或者预设图片来填充。 上面简...

    企鹅号小编
  • 性能优化总结(四):预加载的设计

        本节说一下数据的预加载。这节的内容与SQL没什么关系。主要说的是在 GIX4项目 中,我们是如何设计符合需求的预加载类库的。内容如下: 什么是预加载,为...

    用户1172223
  • 类加载器详解

    内容:转自 java知音 类加载器是负责将可能是网络上、也可能是磁盘上的class文件加载到内存中。并为其生成对应的java.lang.class对象。一旦一...

    用户1257393

扫码关注云+社区

领取腾讯云代金券