技术开发 频道

WebSphere应用服务器类加载机制实践

    WAS中的类加载机制

    了解完Java本身提供的类加载机制后,下面我们看一下WebSphere Application Server(WAS)是如何利用并扩展JVM默认的已有的类加载框架。

    如下是WAS的classloader层次,这里的每一层次可能有多个有父子关系的classloader组成,只是它们的目的是相同或者相关的,所以放在同一层,如表2所示。

表2 WAS Classloader层次

    下面介绍每个层次的classloader所能完成的事,以从顶至下的顺序。注意,区别于JVM默认classloader加载类策略的父亲优先(PARENT_FIRST)的加载策略,WAS中有些扩展的classloader层次可以定义自己的委托策略,比如是父亲优先(PARENT_FIRST)或者父亲最后(PARENT_LAST)。

    1) JVM Classloader层

    这个层其实就是前面介绍的Java基本的classloader框架,由bootstrap classloader、extension classloader、system classloader三个classloader组成,主要是完成jre/lib下,java.ext.dir下,还有JVM classpath下面类的加载。

    2) WebSphere Extensions Classloader层

    这个层的classloader主要完成WAS运行时所需要的类以及相关资源,比如JDBC,Resource Adapter,以及用户扩展WAS运行时库的目录,这一层的委托策略都是父亲优先(PARENT_FIRST)。

    3) WebSphere lib/app Class loader

    这个层的classloader主要是为了兼容WAS Version 4的。它主要用来加载一些所有应用都共享的类,在Version 4以后,推荐用Shared libraries来放需要共享的类库,所以这里就不详细介绍它了。

    4) WebSphere "server" Class loader

    这层的classloader主要是来加载整个运行上当前服务器上的应用程序所共享的的类库,你可以通过定义特定的Shared libraries以来使当前的服务器中的应用程序共享它,这一层的委托策略是父亲优先(PARENT_FIRST)。

    5) Application Class loader

    下面我们到了WASclassloader的最底层。这一层由两个classloader组成:

    第一个是Application Module Class loader,主要负责加载应用程序单元。对于应用程序中的Web单元,我们还可以设定用一个Web Module Class loader去加载(这时它的父亲就是Application Module Class loader),它是WAS classloader中的最底层。

    对于这两个classloader,可以采取的委托策略可以既是父亲优先(PARENT_FIRST),也可以父亲最后(PARENT_LAST)。

    同时,我们还可以指点是单个Application Module Class loader去加载所有的应用程序或者每个应用程序都有自己的Application Module Class loader,这是也为更好的提高classloader的隔离性(Isolation),其选项分别为Multiple与Single。

0
相关文章