performance-optimization
  • Introduction
  • JVM优化篇
    • JVM结构剖析
    • JAVA程序运行原理分析
    • JVM内存模型
    • 详细垃圾回收机制
    • 常见的垃圾回收器有那些
    • JVM性能调优以及配置
      • jstat参数详细配置
      • G1垃圾回收器参数配置
      • JVM性能调优——常用配置
      • JVM性能调优——案例
      • JVM性能调优——理论篇
      • JVM性能调优——实战篇
      • JVM性能优化分析工具
    • ClassLoader详解
    • Tomcat WebappClassLoader 类加载机制源码分析
  • SQL优化篇
    • MySQL优化篇
      • Mysql的联合索引
      • Mysql如何避免回表查询?什么是索引覆盖?
      • 数据库存储的引擎分析
      • 详解索引及优化
        • 索引优缺点
        • 索引种类
        • 不走索引的情况
        • 索引实现分析
        • 高性能前缀索引
      • SQL性能分析
        • 执行计划
        • 慢SQL监控
      • SQL语句分析
        • 业务层面优化
        • 数据库层面优化
        • SQL语句拆分简单sql
      • 理解MYSQL底层索引
      • MySQL性能优化之参数配置
      • MySQL锁机制详解及死锁处理方式
      • MYSQL中update的low_priority
      • InnoDB数据库死锁
      • MySQL中Innodb的聚簇索引和非聚簇索引
      • B+Tree讲解
        • B-/B+树看 MySQL索引结构
        • B+Tree详细讲解
        • MySQL索引背后的数据结构及算法原理
        • 从 MongoDB 及 Mysql 谈B/B+树
      • MySQL索引的数据结构及算法原理
  • WEB容器优化篇
    • Tomcat容器优化篇
      • Tomcat容器内部原理
      • Tomcat可配参数分析
      • Benchmark压力测试
      • Tomcat调优篇实战
    • WEB程序容器结构剖析
Powered by GitBook
On this page
  • tomcat中的ClassLoader
  • WebappClassLoader的类加载机制
  • 第一步
  • 第二步
  • 第三步
  • 第四步
  • 第五步

Was this helpful?

  1. JVM优化篇

Tomcat WebappClassLoader 类加载机制源码分析

PreviousClassLoader详解NextSQL优化篇

Last updated 5 years ago

Was this helpful?

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地址:

GIT地址:

http://www.jianshu.com/u/1f0067e24ff8
点击这里快速进入简书
http://git.oschina.net/brucekankan/
点击这里快速进入GIT
JAVA程序运行原理分析