Tomcat的class加载机制

众所周知,jvm ClassLoader采用双亲委派加载机制,先进行科普下jvm的双亲委派(parents Delegation Model)。

jvm有三种加载类分别是


BootClassLoader,用于加载虚拟机自己的类包,路径JAVA_HOME/lib 或者 -Xbootclasspath指定的,下并且是被虚拟机识别的(按照文件名识别,如果在lib下但是不被虚拟机识别的名称的jar也不会加载的)


ExtensionClassLoader, 加载系统拓展类,路径JAVA_HOME/lib/ext  或者 java.ext.dirs系统变量指定的路径


ApplicationClassLoader 应用加载类,主要就是用户自己开发的类 


他们的层级也自然是从下至上,但是他们的上下级关系不是真正的继承而是组合模式(引用父级classLoader)


那么何为双亲委派呢?当一个类加载器要加载一个类时它会首先问自己的 上级是否能够加载,逐级询问直到最高级都不能加载时它再去加载。

tomcat在遵循双亲委派机制的同时,自己额外新增了几个个加载器分别是commonclassloader   sharedclassloader  catalinaclassloader webappclassloader  jspclassloader


我们先不讨论这几个加载器是干嘛用的,tomcat有支持4个目录分别是common、shared、server、web-inf/lib,common下的类库tomcat和应用都能使用,shared目录下的类库所有的web应用都能共享,server目录下的类库只有tomcat能够使用,最后一个WEB-INF/lib下的类库只能被所属系统应用使用,那么从描述自然可以感受到上述几个加载器对应加载目录及层级关系了

225859_PdH3_1378657.png

(catalinaclassloader加载server目录下类库)



一个web应用一个webappclassloader

jspclassloader专门用于加载jsp生成的class文件的,一个jsp文件一个jspclassloader,当jsp文件发生更改时都会新增一个jspclassloader用与加载器并删除旧的jsp加载器。



tomcat6以上的版本,大家可能看不到common,shared,server这些目录,只有lib,lib目录的作用就相当于common的作用,如果需要server,shared这样的类库区分,可以在conf下修改catalina.xml配置就,指定server.loader  shared.loader

转载于:https://my.oschina.net/francis0115/blog/389232

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值