需要了解的知识JVM 类加载机制深入浅出

tomcat中的ClassLoader

  • 启动类加载器(BootStrap ClassLoader):引导类装入器是用本地代码实现的类装入器,它负责将 jdk中jre/lib下面的核心类库或-Xbootclasspath选项指定的jar包加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。
  • 扩展类加载器(Extension ClassLoader):扩展类加载器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将jdk中jre/lib/ext或者由系统变量-Djava.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。
  • 系统类加载器(System ClassLoader):系统类加载器是由 Sun的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径java -classpath或-Djava.class.path变量所指的目录下的类库加载到内存中。开发者可以直接使用系统类加载器。
  • StandardClassLoader 负责加载tomcat容器相关的类
  • WebappClassLoader 是每个web项目对应一个WebappClassLoader。这样做的目的是每个项目中都会有相同的类(package+classname),而类的内容不一样。这样每个项目一个WebappClassLoader可以达到隔绝项目类冲突的问题。

下面我们主要讲解下WebappClassLoader的类加载机制

第一步


首先调用findLoaderClass0() 方法检查WebappClassLoader中是否加载过此类。


WebappClassLoader 加载过的类都存放在 resourceEntries 缓存中。

protected final Map<String, ResourceEntry> resourceEntries =  new ConcurrentHashMap<>();

第二步


如果第一步没有找到,则继续检查JVM虚拟机中是否加载过该类。
调用ClassLoader的findLoadedClass() 方法检查

第三步


如果前两步都没有找到,则使用AppClassloader加载该类(也就是当前JVM的ClassPath)

第四步


如果前三步都没找到,通过filter() 方法检查该类是否在定义的包名下,如果在则通过 StandardClassLoader类加载。

第五步


如果前4步都没有找到,将由WebappClassLoader来加载。


从当前的工程的Web-INF/classes 目录下查找


如果找到,则创建ResourceEntry对象,保存这个类的元信息,并把他保存在WebappClassLoader的resourceEntries中,便于下次查找。

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

Tomcat WebappClassLoader 类加载机制源码分析相关推荐

  1. Apache Storm 实时流处理系统通信机制源码分析

    我们今天就来仔细研究一下Apache Storm 2.0.0-SNAPSHOT的通信机制.下面我将从大致思想以及源码分析,然后我们细致分析实时流处理系统中源码通信机制研究. 1. 简介 Worker间 ...

  2. Tomcat 处理 HTTP 请求源码分析(下)【转】

    原文地址:https://www.infoq.cn/article/zh-tomcat-http-request-2 很多开源应用服务器都是集成 tomcat 作为 web container 的,而 ...

  3. Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法

    Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法 1.spreadOutApp尽量平均分配到每个executor上: 2.非spreadO ...

  4. ART虚拟机 | Cleaner机制源码分析

    目录 思考问题 1.Android为什么要将Finalize机制替换成Cleaner机制? 2.Cleaner机制回收Native堆内存的原理是什么? 3.Cleaner机制源码是如何实现的? 一.版 ...

  5. Tomcat 处理 HTTP 请求源码分析(上)【转】

    原文地址:https://www.infoq.cn/article/zh-tomcat-http-request-1 很多开源应用服务器都是集成 tomcat 作为 web container 的,而 ...

  6. java tomcat源码_详解Tomcat系列(一)-从源码分析Tomcat的启动

    在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...

  7. k8s 驱逐eviction机制源码分析

    原理部分 1. 驱逐概念介绍 kubelet会定期监控node的内存,磁盘,文件系统等资源,当达到指定的阈值后,就会先尝试回收node级别的资源,比如当磁盘资源不足时会删除不同的image,如果仍然在 ...

  8. Android——RIL 机制源码分析

    Android 电话系统框架介绍 在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1. ...

  9. Linux Thermal机制源码分析之Governor

    一.thermal_init() 在开始源码分析之前,需要先说明一下.Linux 内核代码庞大而复杂,如何 reading the Fxxking source code 相信是很多从事 Linux ...

最新文章

  1. 使用rest_framework写api接口的一些注意事项(axios发送ajax请求)
  2. opencv-python(PIL)图像处理之训练模型前的几种图预处理
  3. 填个小坑,Vue不支持IE8及以下,跨域ajax不支持IE9
  4. python dataframe遍历_对Python中DataFrame按照行遍历的方法
  5. node.js详解Http服务器
  6. java 多线程基础(一)
  7. 运算放大器权威指南_运算放大器科普文章
  8. FISCO BCOS PBFT是什么 基础流程
  9. Notes Twenty one days-渗透攻击-红队-权限提升
  10. CodeBlocks下载+界面优化+创建文件+常用快捷键
  11. ISO 2768-2 标准
  12. centos文件锁定解锁_解锁后轻松替换锁定的文件
  13. iphone屏幕镜像如何全屏_苹果手机屏幕镜像如何连接电视
  14. 基于SpringBoot的外卖点餐小程序 餐厅点单小程序
  15. 2022 年江苏省职业院校技能大赛(中职) 网络搭建与应用赛项公开赛卷
  16. 计算机软考科目众多 我们该如何选择考试科目?
  17. 如何将计算机网络设置为家庭网络连接打印机共享,怎样设置家庭网络打印机共享...
  18. 华硕B85主板刷nvme协议全过程
  19. [CF1131F] Asya And Kittens
  20. idea工具Git和SVN共存的方法

热门文章

  1. 八十二、Python | Leetcode贪心算法系列
  2. SIGIR 2021|重新思考Attention在CTR预估中作用
  3. 重磅发布!最新版《动手学深度学习》PDF 版今天终于可以下载
  4. HAN:基于双层注意力机制的异质图深度神经网络
  5. Python GUI编程(Tkinter)笔记
  6. stolz定理考研能用吗_重磅,考研数学最后重点预测
  7. 【Windows工具】BBDown.exe B站视频下载工具详细使用说明(https://github.com/nilaoda/BBDown)
  8. Spring 配置元数据
  9. 解决XML中报“cvc-complex-type.2.4.a: Invalid content was found starting with element ”错误
  10. cdh jar包 sqoop2_安装sqoop1.4.6-cdh5.5.2