深入理解java虚拟机(12):类加载系统案例-tomcat类加载器架构

class文件格式与执行引擎这部分,用户程序可以影响的不多,class文件格式,以及如何存储,类型何时加载,何时连接以及虚拟机如何执行字节码指令等都由虚拟机直接控制的行为。能通过程序控制的只有字节码的生成和类加载器这两部分功能。

1、案例一:tomcat正统的类加载器架构

web服务器都有如下类加载需求

1)两个不同的javaweb程序使用的java类库要隔离,可以允许自己使用不同的版本。

2)两个不同的javaweb程序使用的java类库在内存里面要能共享,防止虚拟机方法区出现膨胀

3)服务器要保证自身的类库不受应用程序的影响,这样才能保证自己的安全。

4)支持jsp应用的服务器,大多数需要支持HotSwap功能

因为以上几个问题

单独一个classpath无法满足需求,所以会提供好几个ClassPath路径用户存放第三方类库。这些路径通常以lib和classes命名。被放置到不同路径的类库,具备不通的范围和服务对象,每一个目录都有一个对应的自定义的类加载器,去加载里面放置的java类库,

tomcat目录结构中有/common/*、/server/*、/shared/*、另外还有Web应用程序的自身目录的/WEB-INF/*,一共四组。

放置在/common/*,类库可以被tomcat和所有web应用程序共同使用

放置在/server/*,类库只能被tomcat使用

放置在/shared/*,所有web应用程序可以使用

放置在/WEB-INF/*,类库只能被自己的应用程序使用

tomcat自定义了多个类加载器:

 

 

CommonClassLoader,CatalinaClassLoader,SharedClassLoader,WebAppClassLoader是tomcat自定义的类加载器,分别加载对应common,server,shared,web-inf等几个文件夹下的java类库,其中webapp加载器和JasperLoader加载器有多个实例,每一个web应用程序对应一个webapp加载器,每一个jsp文件对应一个jasperLoader加载器。从其中委派关系来看,CommClassLoader加载的类库,大家都可以用,CaalinaClassLoader加载的就只能自己用,SharedClassLoader只有web应用程序可以用。WebAppClassLoader各自加载的各自隔离,jasperLoader仅仅限于这个jsp文件编译的类,每次jsp文件修改替换掉jasperLoader实例,建立一个新的类加载器实例实现hotswap功能。

Tomcat6.x以后只有配置了

tomcat/conf/catalina.properties配置文件的server.loader,share.loader才能真正建立,CatalinaClassLoader,SharedClassLoader,如果没有会将这三个文件夹合并成lib文件和以前common文件功能一样。

posted on 2019-11-27 09:57  清浊  阅读(205)  评论(0)    收藏  举报