websphere调整类加载顺序的真正效果

问题很小,但是也很容易忽略。正如之前反反复复在websphere里设置应用的类加载顺序的时候,从来没去想这个调整真正改变了什么。

 

1. java的类加载器:


websphere调整类加载顺序的真正效果_第1张图片

JAVA类加载器分为3层——引导加载器、扩展加载器、应用程序加载器,类加载遵循"父委托模式".

引导加载器(Bootstrap):  加载/jre/lib 下的vm.jar,core.jar等核心

扩展加载器(Extensions):   加载<JAVA_HOME>/jre/lib/ext  或者通过java.ext.dirs 这个系统属性指定的路径下的代码

应用程序加载器(Application):  加载java.class.path下的代码(就是我们程序及程序依赖的第三方类) 

 

2. websphere类加载模型


websphere调整类加载顺序的真正效果_第2张图片
 JVM ClassLoader层(包含上述的JAVA 3个层次的类加载器)——>WebSphere Extensions Classloader——>WebSphere "server" Class loader——>Application Classloader(包含有Application Module Classloader和Web Module ClassLoader.这2个类加载器上可以设置类加载顺序)

 

3.默认类加载顺序(父类优先)

Websphere采用的是父类优先的类加载顺序。通过websphere控制台——故障诊断——类装入器查看器 我们可以看到一个应用在websphere上部署完成启动后真正形成的类加载层次:


websphere调整类加载顺序的真正效果_第3张图片
 如图,类加载层次是:

JDK扩展装入器(也就是java类加载器中的扩展加载器(Extensions))——应用程序装入器应用程序加载器(Application)——OSGI(was6.1新特性)装入、引导程序、类保护器——组合类装入器——组合类装入器

 

4.改变类加载顺序(应用程序优先)

这里是关键。我一直认为改变WAS中的类加载顺序,调整的是WAS扩展出来的那些类加载层次:也就是上面的“OSGI(was6.1新特性)装入、引导程序、类保护器——组合类装入器——组合类装入器”顺序的改变。

实际情况是:


websphere调整类加载顺序的真正效果_第4张图片
 可以看到,事实上的情况是,改变了类加载顺序之后,最低级的2个类加载器竟然排到了扩展加载器(Extensions)之上,仅在引导加载器(Bootstrap)之后,也就是说:

 

“应用程序优先”的类加载顺序的结果是:

引导加载器(Bootstrap)——原来最低级的web和module加载器——扩展加载器(Extensions)——应用程序加载器(Application)——was扩展classloader、WAS应用程序类加载器

 

5.额外的:

websphere能把类加载器提高到这么高的层次,不知道是否是因为websphere6.1使用的JDK是IBM自己实现的而不是使用sun的JDK呢?

你可能感兴趣的:(websphere)