Tomcat核心知识梳理(Tomcat体系结构、Tomcat类加载机制剖析、Jvm类加载机制剖析)

目录

Tomcat体系结构

概要

Tomcat体系结构结构概念如下:

Server

Engine

Host

Connector

Context

Wrapper

找到Tomcat安装路径下的Server.xml看到tomcat中的内部结构(去掉杂余注释更清晰,如下代码)

Tomcat类加载机制剖析

 JVM 的类加载机制

双亲委派机制

什么是双亲委派机制

双亲委派机制的作⽤

Tomcat 的类加载机制


Tomcat体系结构

概要

Tomcat是⼀个Http服务器(能够接收并且处理http请求,所以tomcat是⼀个http服务器)我们使⽤浏览器向某⼀个⽹站发起请求,发出的是Http请求,那么在远程,Http服务器接收到这个请求之后,会调⽤具体的程序(Java类)进⾏处理,往往不同的请求由不同的Java类完成处理。

Tomcat体系结构结构概念如下:

Server

一个 Tomcat 代表一个 Server 服务器.

Engine

Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理。

Host

     代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配 每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理匹配的方法是“最长匹配”,所以一个path==”"的Context将成为该Host的默认Context所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配。

Connector

    连接器负责将各种网络协议封装起来,对外部屏蔽了网络连接与 IO 处理的细节,将处理得到的 Request 对象传递给容器处理,Tomcat 将处理请求的细节封装到 ProtocolHandler。在 Tomcat 中一共设计了 4 种容器,它们分别为 Engine、Host、Context、Wrapper

Context

一个Context对应于一个Web Application,一个WebApplication由一个或者多个Servlet组成 Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类,当Context获得请求时,将在自己的映射表(mapping table)中寻找相匹配的Servlet类。如果找到,则执行该类,获得请求的回应,并返回。

Wrapper

  表示⼀个Servlet,Wrapper 作为容器中的最底层,不能包含⼦容器。

 

找到Tomcat安装路径下的Server.xml看到tomcat中的内部结构(去掉杂余注释更清晰,如下代码)

<!--Server-->

<Server port="8005" shutdown="SHUTDOWN">

<!--Service-->

  <Service name="Catalina">

<!--Connector-->

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

    <!--Engine-->

<Engine defaultHost="localhost" name="Catalina">

     <!--Host-->

      <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">

      <!--Context-->

        <Context docBase="handler-api" path="/handler" reloadable="true" source="org.eclipse.jst.jee.server:handler-api"/>

      </Host>

</Engine>

  </Service>

</Server>

Tomcat类加载机制剖析

     java类(.java)—> 字节码⽂件(.class) —> 字节码⽂件需要被加载到jvm内存当中(这个过程就是⼀个类加载的过程)类加载器(ClassLoader,说⽩了也是⼀个类,jvm启动的时候先把类加载器读取到内存当中去,其他的类(⽐如各种jar中的字节码⽂件,⾃⼰开发的代码编译之后的.class⽂件等等))要说 Tomcat 的类加载机制,⾸先需要来看看 Jvm 的类加载机制,因为 Tomcat 类加载机制是在 Jvm 类加载机制基础之上进⾏了⼀些变动。

 JVM 的类加载机制

     JVM 的类加载机制中有⼀个⾮常重要的⻆⾊叫做类加载器(ClassLoader),类加载器有⾃⼰的体系,Jvm内置了⼏种类加载器,包括:引导类加载器、扩展类加载器、系统类加载器,他们之间形成⽗⼦关系,通过 Parent 属性来定义这种关系,最终可以形成树形结构。

 

类加载器 

引导启动类加载器

BootstrapClassLoader

c++编写,加载java核⼼库 java.*,⽐如rt.jar中的类,构

造ExtClassLoader和AppClassLoader

扩展类加载器 ExtClassLoader

java编写,加载扩展库 JAVA_HOME/lib/ext⽬录下的jar

中的类,如classpath中的jre ,javax.*或者java.ext.dir

指定位置中的类

系统类加载器

SystemClassLoader/AppClassLoade

默认的类加载器,搜索环境变量 classpath 中指明的路

另外:⽤户可以⾃定义类加载器(Java编写,⽤户⾃定义的类加载器,可加载指定路径的 class ⽂件)

当 JVM 运⾏过程中,⽤户⾃定义了类加载器去加载某些类时,会按照下⾯的步骤(⽗类委托机制)

  1) ⽤户⾃⼰的类加载器,把加载请求传给⽗加载器,⽗加载器再传给其⽗加载器,⼀直到加载器树的顶层

  2)最顶层的类加载器⾸先针对其特定的位置加载,如果加载不到就转交给⼦类

  3)如果⼀直到底层的类加载都没有加载到,那么就会抛出异常 ClassNotFoundException

 因此,按照这个过程可以想到,如果同样在 classpath 指定的⽬录中和⾃⼰⼯作⽬录中存放相同的class,会优先加载 classpath ⽬录中的⽂件

双亲委派机制

什么是双亲委派机制

  当某个类加载器需要加载某个.class⽂件时,它⾸先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,⾃⼰才会去加载这个类。

双亲委派机制的作⽤

(1)防⽌重复加载同⼀个.class。通过委托去向上⾯问⼀问,加载过了,就不⽤再加载⼀遍。保证数据安全。

(2)保证核⼼.class不能被篡改。通过委托⽅式,不会去篡改核⼼.class,即使篡改也不会去加载,即使加载也不会是同⼀个.class对象了。不同的加载器加载同⼀个.class也不是同⼀个.class对象。这样保证了class执⾏安全(如果⼦类加载器先加载,那么我们可以写⼀些与java.lang包中基础类同名的类, 然后再定义⼀个⼦类加载器,这样整个应⽤使⽤的基础类就都变成我们⾃⼰定义的类了。)

Object类 -----> ⾃定义类加载器(会出现问题的,那么真正的Object类就可能被篡改了)

Tomcat 的类加载机制

Tomcat 的类加载机制相对于 Jvm 的类加载机制做了⼀些改变。

没有严格的遵从双亲委派机制,也可以说打破了双亲委派机制

⽐如:有⼀个tomcat,webapps下部署了两个应⽤

app1/lib/a-1.0.jar com.test.Abc

app2/lib/a-2.0.jar com.test.Abc

不同版本中Abc类的内容是不同的,代码是不⼀样的

(1)引导类加载器 和 扩展类加载器 的作⽤不变

(2)系统类加载器正常情况下加载的是 CLASSPATH 下的类,但是 Tomcat 的启动脚本并未使⽤该变量,⽽是加载tomcat启动的类,⽐如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定。位于CATALINA_HOME/bin下

(3)Common 通⽤类加载器加载Tomcat使⽤以及应⽤通⽤的⼀些类,位于CATALINA_HOME/lib下,⽐如servlet-api.jar

(4)Catalina ClassLoader ⽤于加载服务器内部可⻅类,这些类应⽤程序不能访问

(5)Shared ClassLoader ⽤于加载应⽤程序共享类,这些类服务器不会依赖

(6)Webapp ClassLoader,每个应⽤程序都会有⼀个独⼀⽆⼆的Webapp ClassLoader,他⽤来加载本应⽤程序 /WEB-INF/classes 和 /WEB-INF/lib 下的类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值