tomcat类加载原理

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在初始化时创建以下类加载器:

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 类加载器

这个类加载器包含对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

作者:IT_搬运工
来源:CSDN
原文:https://blog.csdn.net/fd2025/article/details/80592099
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值