这个问题的核心是classloader

上图中 启动类加载器,扩展类加载器,应用程序类加载器是 jvm 自带的类加载器.

comm  catalina  shared webapp 是tomcat 扩展的加载器,他们分别加载 /common/*/server/*/shared/*

WebAppClassLoader 负载加载  webapp 目录的jar 和 class .

WebAppClassLoader  没有遵循双亲委托模式,他的具体加载逻辑如下:

第1步:检查当前class loader 的缓存resourceEntries,是否已经加载,如果有直接返回。

第2步:检查 jvm 自带加载器是否加载过。

第3步:尝试用  javaseClassLoader 去加载,为什么要做这个尝试呢,防止代码重写了java.lang.String  等jdk核心类,从而导致异常。

第4步:如果设置了双亲委托模式 delegateLoad=true ,尝试用父加载器加载。

第5步: 尝试从当前classloader 制定的目录中加载,同时会将加载信息放到缓存中 resourceEntries

这样就实现了资源隔离。

扩展信息:

1.通过gc 回收class loader ,从而可以实现回收class,重新创建classloader,然后重新load class ,从而达到不重启jvm更新class的目的(热更新),jsp 的热更新就是这么干的。

2. jvm instrumentation 机制可以通过agent,去修改正在运行中的已加载的class 对象,该方法很有用,比如生产环境出了问题,重启后问题无法复现,那么就可以在线增加日志排错.

阿里巴巴基于该原理开发了一个强大在线调试工具: https://github.com/alibaba/arthas

3. ClassFileTransformer  利用tranformer 和 class loader 可以实现很多很神奇的功能,比如所有controller 方法第一行打印出请求参数,实现这个目的可以用spring AOP,同时也可以用ClassFileTransformer。

groovy 通过大量的 ClassFileTransformer 修改了很多jdk 核心class 的方法.

相关资源:

1.https://blog.csdn.net/sdmjhca/article/details/77716899

2.https://www.cnblogs.com/aspirant/p/8991830.html

tomcat 是如何做到不同webapp 类隔离的的更多相关文章

  1. JBoss类隔离

    http://tiger888.iteye.com/blog/572875这几天,项目组在部署JBOSS时遇到不少问题,都是由于JBOSS的类装载问题引起,特发表一篇BLOG详细说一下JBOSS的类隔 ...

  2. Tomcat负载均衡、调优核心应用进阶学习笔记(二):Tomcat前世今生、安装、配置文件详细说明、tomcat应用程序部署、webapp 体系结构、tomcat运行方式

    文章目录 Tomcat前世今生 安装 配置文件详细说明 tomcat应用程序部署 webapp 体系结构 tomcat运行方式 Tomcat前世今生 java体系: 1 java程序设计语言 2 ja ...

  3. 一个tomcat上放多个webapp问题,那这多个webapp会不会竞争端口呢?不会!安全两码事

    1.一个tomcat上放多个webapp问题,那这多个webapp会不会竞争端口呢?不会!安全两码事

  4. 对tomcat中使用反射加载类的理解

    public void init() throws Exception { initClassLoaders(); //加载一下jar包和类 Thread.currentThread().setCon ...

  5. tomcat 5.5 动态加载类

    转载于:http://www.itxuexiwang.com/a/javadianzishu/tomcat/2016/0225/161.html?1456480735 开发使用的是tomcat5.5. ...

  6. tomcat热部署,更改java类不用重新加载context

    修改类后,tomcat热部署会重新加载整个项目的context,影响开发效率.网上查的大多数是将server的modules标签中Auto Reload项改为Disabled,但是没有效果. 使用以下 ...

  7. Tomcat 没有自动解压webapp下的war项目文件问题

    默认选择的tomcat安装在了C盘下的C:\Program Files下 所以webapp文件也在C盘下 选择启动tomcat时 我选择了 bin下的 Tomcat.exe 显示成功启动 打开项目网站 ...

  8. Apache.Tomcat 调用Servlet原理之Class类的反射机制,用orc类解释

    有一个兽人类 package com.swift.servlet; public class OrcDemo { private int hp; private int mp; private int ...

  9. tomcat容器是如何创建servlet类实例?用到了什么原理?

    当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件进行解析,并读取servlet注册信息.然后,将每个应用中注册的servlet类都进行加载,并通过  ...

随机推荐

  1. 2019牛客多校A All-one Matrices——单调栈

    题目 求非嵌套子矩阵的个数. 分析 单调栈的套路题(类似的有求最大子矩阵). 首先,按列预处理,每个位置化成连续1的个数. 例如,左边的图转成右边.                      然后枚举 ...

  2. 49、[源码]-Spring容器创建-创建Bean准备

    49.[源码]-Spring容器创建-创建Bean准备

  3. 靠边的列表如果没有设置margin-left:20px,那么是看不到列表序号的。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 字符串转换json格式

    前台json转字符串传递后台时 用到: data: JSON.stringify({ "zh": zhanghao, "mm": mima }), 当后台返回前 ...

  5. mongodb 开发规范

    一.命名规则 1.数据库命名规则 数据库名可以是满足以下条件的任意UTF-8字符串: (1)不能是空字符串(”") : (2)不能含有”(空格)...$./..和(空字符): (3)应全部小 ...

  6. NOIP刷题

    搜索 [NOIP2013]华容道 最短路+带剪枝的搜索,是一个思维难度比较大的题目. CF1064D Labyrinth 考虑贪心,用双向队列bfs [NOIP2017]宝藏 剪枝搜索出奇迹 题解:h ...

  7. 洛谷P2305 [NOI2014]购票 [DP,树状数组]

    传送门 思路 显然是树形DP,显然是斜率优化,唯一的问题就是该怎么维护凸包. 套路1:树上斜率优化,在没有这题的路程的限制的情况下,可以维护一个单调栈,每次加入点的时候二分它会加到哪里,然后替换并记录 ...

  8. 正则re.complie作用

    封装一个原本重复使用的正则表达式 prog = re.compile(pattern) result = prog.match(string)

  9. 去掉BigDecimal类型变量小数点后多余的零

           业务背景:mysql中A表中的B字段的类型是decimal类型,小数位数是三位,某一条数据的值是3000000,在Java中查询出来的结果是3000000.000,这样显示在页面中不太好 ...

  10. codeforces#1249F. Maximum Weight Subset(树上dp)

    题目链接: http://codeforces.com/contest/1249/problem/F 题意: 一棵树的每个节点有个权值,选择一个节点集,使得任意点对的距离大于$k$ 求最大节点集权值, ...