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

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页