前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tomcat WebappClassLoader 类加载机制源码分析

Tomcat WebappClassLoader 类加载机制源码分析

作者头像
java404
发布2018-05-18 12:22:23
1.3K0
发布2018-05-18 12:22:23
举报

需要了解的知识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中,便于下次查找。


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.09.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • tomcat中的ClassLoader
  • 第一步
  • 第二步
  • 第三步
  • 第四步
  • 第五步
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档