图解tomcat类加载机制(tomcat7)

图解tomcat类加载机制(tomcat7

1.1 java类加载器

1.1.1 类加载

在JVM中并不是一次性把所有的文件都加载,按时按需加载,比如JVM启动时,会通过不同的类加载器加载不同的类。当用户在自己的代码中,需要某些额外的类时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用。

1.1.2 什么是类加载器

类加载器是一个用来加载类文件的类,java源代码通过javac编译器编译成类文件,然后JVM来执行类文件中的字节码来执行程序,类加载器负责加载文件系统、网络或其他 来源的类文件。有三种默认的类加载器:

  • BootStrap类加载器–加载/jre/lib/rt.jar
  • Extension类加载器– /jre/lib/ext/下的jar包
  • Application类加载器-加载用户类路径CLASSPATH下的类

这里写图片描述

下面介绍类的加载顺序,例如加载com.xxx.Test

  • 首先由Application类加载器委托给它的父类加载器Extension类加载器,然后再委托给Bootstrap类加载器。
  • BootStrap 类加载器会先看看rt.jar中有没有这个类,如果没有这个类,则把这个加载请求返回给Extension类加载器,
  • Extension 类加载器会查看/jre/lib/ext/目录下有没有这个类,如果没有,则交由Application类加载器处理。
  • Application类加载器从classpath中寻找,如果还是没有,则报ClassNotFoundException异常

1.2 tomcat类加载器

tomcat类加载器

如上图所示,tomcat在初始化时创建以下类加载器:

  • Bootstrap 类加载器

    加载JVM启动所需的类以及标准扩展类($JAVA_HOME/jre/lib/ext下)

  • System类加载器

    加载tomcat启动所需的类,通常在catalina.bat或者catalina.sh中指定。位于CATALINA_HOME/bin下。
    包含一下类:$CATALINA_HOME/bin/bootstrap.jar:tomcat server启动所需的main方法,
    $CATALINA_BASE/bin/tomcat-juli.jar:日志接口实现类,包含java.util.loggingAPI 。

  • Common 类加载器

    扫描二维码关注公众号,回复: 1541445 查看本文章

    这个类加载器包含对Tomcat内部类和所有Web应用程序都可见的附加类。 位于 $CATALINA_BASE/lib下

  • webappclassloader

    每个web应用都有一个对应的类加载器实例,该类加载器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理给父类加载器。这与一般加载器的顺序是相反的。这是java servlet规范中的推荐做法,其目的是是的web应用自己的类优先级高与web容器提供的类。这种代理模式的一个例外是:Java核心库是不再查找范围之内的。这也是为了保证Java核心库的类型安全。

因此,从web应用程序的角度来看,类或资源加载的顺序如下:

  • 使用Bootstrap 加载器加载
  • web application下的/WEB_INF/classes
  • web application下的/WEB_INF/lib/*.jar
  • System类加载器
  • Common类加载器

如果应用程序配置了,则变成一下顺序:

  • BootStrap类加载器
  • System类加载
  • Common类加载器
  • web application下的/WEB_INF/classes
  • web application下的/WEB_INF/lib/*.jar

这里写图片描述

猜你喜欢

转载自blog.csdn.net/fd2025/article/details/80592099