类加载器就是根据类的全限定名(例如com.ty.xxx.xxx)来获取此类的二进制字节流的代码模块,从而程序可以自己去获取到相关的类。

一、java中的类加载器

  1、类加载器类别

java中的类加载器主要分为三类:

Bootstrap ClassLoader:启动类加载器,负责加载<JAVA_HOME>\lib目录中的class文件;

Extension ClassLoader:扩展类加载器,负责加载<JAVA_HOME>\lib\ext路径下的class文件;

Application ClassLoader:应用程序类加载器,也称为系统类加载器。负责加载用户路径上所指定的类库,开发者可以直接使用,如果开发者没有自己定义类加载器,一般就是使用此类加载器。

类加载器的层次结构如下:

2、双亲委派模型

要求:除了顶层的启动类加载器之外,其他的类加载器都必须具有父类

解释:如果一个类加载器收到了加载类的请求,首先并不会自己尝试加载这个类,而是将请求委派给父类加载器完成,父类又去委派给其父类,因此最终的请求都到了顶层,若顶层类加载器无法加载,子类再尝试自己加载。

好处:费了这么大劲,到底有啥好处呢?

按照双亲委派模型加载类,会让类首先有一种层次感,或者说是上下级感。最顶层的类加载器只加载<JAVA_HOME>\lib下的class文件,这是jdk的核心所在,当然也是凌驾于开发者所创建的class文件。并且能够保证整个jvm中,所有的基础类,例如Object等等,

都是同一个类。哪怕程序员自己创建了java.lang.object类,编译可以通过,但是永远不会被加载。

3、java委派过程

a、从缓存中加载;

b、如果缓存中没有,则从父类尝试加载;

c、如果父类加载器中没有,则从当前类加载器加载;

d、如果没有,则抛出异常。

二、Tomcat中的类加载

  Tomcat中的类加载没有遵循双亲委派模型,为啥?双亲委派说的这么吊,为什么Tomcat不使用这种方式加载类?

Tomcat类加载器需要解决的问题:

1、解决不同应用中使用某一第三方库的不同版本

因为将web应用部署到Tomcat中,不同应用很有可能会使用到同一类库,例如某第三方库,并且使用了不同版本。这时如果使用jvm默认的类加载的机制,不同版本的类只会保存一种,因为他认的只有全限定名,例如com.ty.xxx.xxx.class,这样不同应用就无法

做到隔离,显然是不行的。

2、 部署在同一个web容器中相同的类库相同的版本可以共享

这样做很明显是为了防止资源浪费。

3、Tomcat作为应用服务器,也有自己所依赖的类,需要与web应用隔离

基于安全考虑,应该让容器的类库和程序的类库隔离开来。

4、支持jsp的热修改

jsp的本质也是servlet,jsp在程序中使用也是编译成servlet才能发挥作用。修改jsp则是非常常见的事情,那对于类加载器来说,jsp的类名并没有更改,因此按照默认的类加载机制,会直接从方法区中去class文件。Tomcat为了解决这个问题,将每个jsp

都对应一个类加载器,jsp发生修改后,直接销毁此类加载器,重新生成,然后加载修改后的文件。

设计图如下:

  commonLoader:Tomcat最基本的类加载器,加载路径中的class可以被Tomcat容器本身以及各个Webapp访问;
  catalinaLoader:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不可见;
  sharedLoader:各个Webapp共享的类加载器,加载路径中的class对于所有Webapp可见,但是对于Tomcat容器不可见;
  WebappClassLoader:各个Webapp私有的类加载器,加载路径中的class只对当前Webapp可见;

Tomcat类加载器加载顺序(对于WebApp ClassLoader来说):

a、从缓存中加载;

b、如果没有,则从JVM的Bootstrap类加载器加载;

c、如果没有,则从当前类加载器加载(按照WEB-INF/classes、WEB-INF/lib的顺序);

d、如果没有,则从父类加载器加载,由于父类加载器采用默认的委派模式,因此加载顺序为Extension ClassLoader-->Application ClassLoader-->Common ClassLoader-->Shared ClassLoader

Tomcat架构解析(五)-----Tomcat的类加载机制的更多相关文章

  1. Tomcat架构解析(一)-----Tomcat总体架构

    Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助. 一.Server   1.最简单的服务器结构 最简单的服务器结构如图所示: ...

  2. 浅读tomcat架构设计之tomcat生命周期(2)

    浅读tomcat架构设计和tomcat启动过程(1) https://www.cnblogs.com/piaomiaohongchen/p/14977272.html tomcat通过org.apac ...

  3. 浅读tomcat架构设计之tomcat容器Container(3)

    浅读tomcat架构设计和tomcat启动过程(1) https://www.cnblogs.com/piaomiaohongchen/p/14977272.html 浅读tomcat架构设计之tom ...

  4. Tomcat架构解析(二)-----Connector、Tomcat启动过程以及Server的创建过程

    Connector用于跟客户端建立连接,获取客户端的Socket,交由Container处理.需要解决的问题有监听.协议以及处理器映射等等. 一.Connector设计   Connector要实现的 ...

  5. Tomcat请求处理过程(Tomcat源代码解析五)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  6. 浅读tomcat架构设计和tomcat启动过程(1)

    一图甚千言,这张图真的是耽搁我太多时间了: 下面的tomcat架构设计代码分析,和这张图息息相关. 使用maven搭建本次的环境,贴出pom.xml完整内容: <?xml version=&qu ...

  7. Tomcat架构解析(三)-----Engine、host、context解析以及web应用加载

    上一篇博文介绍了Server的创建,在Server创建完之后,就进入到Engine的创建过程,如下: 一.Engine的创建   1.创建Engine实例 当前次栈顶元素为Service对象,通过Se ...

  8. Tomcat架构解析(六)-----BIO、NIO、NIO2、APR

    对于应用服务器来说,性能是非常重要的,基本可以说决定着这款应用服务器的未来.通常从软件角度来说,应用服务器性能包括如下几个方面: 1.请求处理的并发程度,当前主流服务器均采用异步的方式处理客户端的请求 ...

  9. Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

    Connector是Tomcat中非常重要的一个组成部分,说白了,就是如何从客户端获取到相应的请求信息.这部分主要包括的难点有这样几个部分: 1.客户端与服务端的协议 客户端与服务端的协议是多种多样的 ...

随机推荐

  1. 转载--无弹窗APT渗透实验

    转载--无弹窗APT渗透实验 文章作者:亚信安全,转载自 FreeBuf.COM APT攻击方式花样繁多,我研究最近的流行的APT攻击方式,在本地搭建环境模拟一次简单的APT攻击,在模拟攻击过程中发现 ...

  2. 一个简单的通讯服务框架(大家发表意见一起研究)JAVA版本

    最近研究下java语言,根据一般使用的情况,写了个连接通讯服务的框架: 框架结构 C-Manager-S; 把所有通讯内容抽取成三个方法接口:GetData,SetData,带返还的Get; 所有数据 ...

  3. JDK1.7 ConcurrentHashMap--解决高并发下的HashMap使用问题

    高并发下也可以使用HashTable .Collections.synchronizedMap因为他们是线程安全的,但是却牺牲了性能,无论是读操作.写操作都是给整个集合加锁,导致同一时间内其他操作均为 ...

  4. kettle数据库连接使用变量

    新增db连接(密码也可以设置参数) 转换中,右键空白处,选择转换设置

  5. python3中一句话定义函数

    import math as marea=lambda r:r**2*m.pi #定义一个计算圆的面积的函数area(8) 显示结果 201.06192982974676

  6. git保存用户名和密码

    git保存用户名和密码 简介:tortoiseGit(乌龟git)图形化了git,我们用起来很方便,但是我们拉取私有项目的时候,每次都要输入用户名和密码很麻烦,这里向大家介绍怎么避免多少输入 试验环境 ...

  7. CDialogEx::OnPaint()的问题,或者为什么在对话框程序的OnPaint中绘图无效的问题

    这是一个基于对话框的程序,对话框上有按钮,还有几个CStatic用来绘图,之前都是好好的,今天改成Unicode版本后,编译正常,运行时CStatic中的图像怎么也不显示,有时候会闪现一次就消失,问题 ...

  8. FTRL的理解

    https://blog.csdn.net/ningyanggege/article/details/81133785

  9. Datatable的操作方法

    DataTable操作相关内容: 对DataTable 的一些操作在dataTable中最容易想到的是用for循环来操作,但事实不到万不得已是不会用for循环的,因为效率一般不高. 1. 取行-取行一 ...

  10. SVG绘制太极图

    思路:先画一整个圆,填充颜色为黑色,再用一个边框和填充颜色均为白色的长方形覆盖右半边的半圆,再以同一个圆心,相同半径绘制一整个圆,该圆的边线颜色为黑色,没有填充颜色,最后常规操作再画四个小圆 源代码: ...