`
sqiutz
  • 浏览: 71309 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

WAS的类加载机制二

阅读更多

12.2 概览Websphere 类加载器

注意:每一个JVM都有自己的类加载器。在WebSphere 环境中会有多个应用程序服务器(JVM),也就是说JVM的类加载器是分开的,尽管它们运行在同一个物理机器上。

还需要注意的是:Java虚拟机(JVM) 使用的扩展和应用程序类加载器,你能够看到WebSphere 运行环境也使用名为扩展和应用程序类加载器,尽管它们的名字有些一致,但它们和JVM使用的是不一样的。

WebSphere 提供了几个客户化委托类加载器,如下图12-2:

图12-2 Webspere 类加载器层次图


最顶端的方框表示Java类加载器(引导、扩展和应用程序)。WebSphere 在这里加载它自己的引导类加载器和初始化WebSphere扩展类加载器。

12.2.1 WebSphere 扩展类加载器

V6.1新特性: WebSphere 扩展类加载器是WebSphere 加载自己的地方。在WebSphere之前的版本,运行环境被单一的类加载器加载。然而,从WAS6.1开始,WebSphere 被打包成若干OSGi(Open Services Gateway Initiative) 包。每一个OSGi 包都由自己的类加载器加载。OSGi 类加载器的网络通过OSGi网关类加载器跟扩展类加载器和类加载器层次结构中的其余部分相连。

    不管WebSphere装入自己类的方式如何改变,应用程序也不会有改变。还是同样的可见性、同样的类加载选择。

V6.1新特性:WAS之前的版本中,WebSphere运行时类文件保存在<was_home>目录下的classes、lib、lib\ext和installedChannels 目录下。由于OSGi包,这些目录都不存在了,运行时类文件会存放在<was_home>\plugins 目录下。

扩展类加载器的类路径是由ws.ext.dirs 系统属性指定,也就是setupCmdLine 脚本文件中指定的WAS_EXT_DIRS环境变量设置。ws.ext.dirs 的缺省值如例12-3:

例12-3 we.ext.dirs 的缺省值

SET

WAS_EXT_DIRS=%JAVA_HOME%\lib;%WAS_HOME%\classes;%WAS_HOME%\lib;%WAS_HOME%\insta

lledChannels;%WAS_HOME%\lib\ext;%WAS_HOME%\web\help;%ITP_LOC%\plugins\com.ibm.e

tools.ejbdeploy\runtime

ws.ext.dirs 环境变量中列出的每个路径都会被添加到WebSphere扩展类加载器的类路径中,并且该目录中的每个JAR文件和ZIP文件都会被添加到类路径中。

正如所看到的,尽管在<was_home>目录中不再有classes、lib、lib\ext 和installedChannels文件夹,但是setupCmdLine 脚本文件会把它们添加到扩展类路径中。这就意味着,如果之前你已经把自己的JAR文件添加到<was_home>\lib 目录下,你可以创建这个目录并且把JAR文件添加进去,它们依然会被扩展类加载器加载。然而,不推荐这么做,在安装过程中还是正确的迁移比较好。

另一方面,如果你已经开发了Java应用程序,它依赖之前在<was_home>\lib 目录下的WebSphere JAR文件,你需要让你的程序保留兼容性。WAS 6.1 针对这样的应用程序提供了两种瘦客户端库:管理客户端库和Web 服务客户端库。可以在<was_home>\runtimes 目录下面找到这两个客户端库:

_ com.ibm.ws.admin.client_6.1.0.jar

_ com.ibm.ws.webservices.thinclient_6.1.0.jar

这些库为应用程序提供了连接和与WebSphere一起工作的所有内容。

缺省设置是Allow,意思是你的应用程序可以无限制的调用非公用的内部WebSphere 类。但是不推荐这么使用,在未来的版本这个功能可能会被限制。因此,作为管理员,如果应用程序还能正常运行,最好把这个设置改成Restrict。如果它们依赖非公用的WebSphere内部类,你就收到一个ClassNotFoundException,这样还得改成Allow。这样开发人员就需要对应用程序进行移植,以保证应用程序能够兼容未来的WAS版本。

V6.1新特性:WAR 6.1 限制对WebSphere内部类的访问,这样你的程序才不会依赖那些未公开发布的WAS 的API。这个设置针对每个服务器(JVM),称为访问内部服务器类。

12.2.2 应用程序和Web模块类加载器

J2EE 应用程序包含五个主要元素:Web 模块,EJB 模块,应用程序客户端模块,资源适配器(RAR文件),工具JAR。工具JAR包含了EJB 和Servlet使用的代码。log4j  就是一个好的典型的工具框架的例子。EJB 模块、工具JAR、资源适配器文件和应用程序关联的共享库都会归结到同一个类加载器。这个类加载器称为应用程序类加载器。根据类加载器的规则,缺省情况下,多个应用程序(EAR)可以共享这个类加载器或者每一个应用程序都有对应的类加载器。

缺省情况下,Web 模块使用它们自己的类加载器(WAR类加载器)加载WEB-INF/classes 和EB-INF/lib 目录下的内容。通过修改应用程序WAR类加载策略可以改变这个缺省情况。

缺省情况,应用程序中每个WAR文件都有自己的类加载器(早期的版本,这个设置称为 Module)。如果WAR类加载策略设置成Single(早期的版本称为Application)类加载器,除了EJB、RAR、工具JAR以及共享库之外,Application类加载器还加载Web模块的内容。Application类加载器是WAR类加载器的父亲。Application类加载器和WAR类加载器都是可重装入的类加载器。一旦它们自动监测到程序代码改变了,就会重装入修改的类。我们可以在部署应用程序的时候改变这个行为。

12.2.3 操纵JNI 代码

因为JVM只有一个地址空间,每个地址空间中native代码只能装入一次,JVM规范要求在JVM中native代码只能被一个类加载器加载。

例如,这将导致一个问题,如果你有一个包含两个Web模块的应用程序(EAR文件),两个Web模块都需要通过Java Native Interface(JNI)装入native 代码,那么只有第一个被加载的Web模块能够成功。

为了解决这个问题,你可以把加载到类中的native 代码拆分成多个Java代码并且把它放在WebShpere应用程序类加载器(放在工具JAR)中。然而,如果要在同一个应用程序(JVM)中部署多个这样的应用程序(EAR文件),你需要把类文件放到WebSphere扩展类加载器上,取代每个JVM只能加载一次native代码。

如果native 代码放在一个可加载的类加载器(比如应用程序类加载器或者WAR类加载器),有一点很重要:能够正确的卸载自己的native代码而Java代码能够重加载。WebSphere 无法控制native代码,如果native代码不能正确的卸载或者加载,应用程序可能失败。

    如果native 库依赖另一个,事情就会变得很复杂。关于native库的依赖关系,请查看信息中心。

12.3 配置 WebSphere 类加载器

在之前的内容中,我们了解了WebSphere 类加载器以及类加载器如何协同工作。这一部分我们会讨论如何修改WAS的配置来影响Websphere类加载的行为。

分享到:
评论

相关推荐

    websphere6,7上修改类装载顺序为应用程序优先

    此外,标签中的“源码”可能意味着需要查看WebSphere的源代码来了解类加载机制的细节,而“工具”可能指的是使用WebSphere提供的管理工具进行配置。对于开发者来说,理解这些底层机制有助于更好地调试和优化应用。 ...

    解决网上应用厅部署在was上jar包冲突问题

    - **类加载机制**:深入了解Java的类加载机制对于理解和解决此类问题至关重要。Java采用双亲委派模型来处理类加载过程,这对于理解如何解决类路径冲突问题非常重要。 - **WAS红皮书**:官方发布的WAS红皮书提供了...

    如何在was中解决jar包冲突.pdf

    为了解决这个问题,我们需要了解 WAS 中类加载器的工作机制。 WAS 中类加载器是一个具有父子关系的分层结构,包括 JVM Class loader、WebSphere Extensions Class loader、WebSphere lib/app Class loader、...

    WAS+V7+理解类装入器-红皮书.pdf

    这种机制确保了类的唯一性,即相同的类只会被同一个类装载器加载一次。同时,这也使得类之间的隔离变得可能,即使两个类具有相同的全限定名,只要它们由不同的类装载器加载,就可以视为不同的类。 #### WebSphere类...

    WAS生成工具.rar

    3. **加密保护**:WAS文件可能包含加密机制,防止非法篡改或反编译,保护游戏知识产权。 4. **平台兼容性**:游戏可能需要在不同平台上运行,WAS文件可能适应多种设备或操作系统。 在实际使用这个工具时,用户可能...

    WAS7或WAS8性能优化

    3. **类加载与卸载**:通过调整类加载机制减少不必要的类加载和卸载,如使用-XX:MaxMetaspaceSize=256m 来控制元空间大小。 4. **JIT编译**:JIT编译器可以将热点代码编译为机器码,从而提高执行效率。可以通过-XX:...

    WAS性能调优对jvm、线程数、ORB大小的配置

    3. **类加载机制**:理解并调整类加载器的设置,可以避免类装载冲突和内存泄漏。 接下来,我们关注线程配置: 1. **线程池大小**:线程数的设置应基于应用的并发需求,过多的线程可能导致内存浪费,过少则可能导致...

    axis2整合进was7的步骤

    在WAS7管理控制台中,为Axis2应用程序设置安全角色、授权和认证机制。 - 这包括设置Web容器安全性和EJB容器安全性,以及配置任何必要的SSL证书。 ### 7. 测试部署 - 完成配置后,启动WebSphere Application Server...

    大话西游WAS导出PNG图片,C#源码!方便导出大话西游WDF资源.非本人原创!

    2. **数据解析**:理解WAS文件的格式规范,根据规范解析文件头和数据块,可能需要使用位运算和自定义解码算法。 3. **图像处理**:将解码后的图像数据转换为`Bitmap`或`WriteableBitmap`对象,利用图像处理API进行...

    CXF support WAS Weblogic

    - 如果使用JBoss AS,则需要确保开启类加载隔离机制。 #### 常见问题解答 **1. ClassCastException: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl** 当使用Oracle OC4J时,可能会遇到此类错误。解决方案...

    WebSphere Application Server V7 理解类装入器 中文翻译版

    2. **加载类**:将.class文件中的二进制数据读入内存,并转换为可执行的形式。 3. **链接类**:确保类被正确解析并准备好执行,这一步骤通常包括验证、准备和解析三个阶段。 4. **初始化类**:执行类中的静态初始化...

    Security in WAS V61

    2. **Java安全**:J2EE环境下的安全措施,涵盖类加载器、代码签名等。 3. **WebSphere安全**:WAS特有的安全功能,比如用户注册、授权管理等。 ### 安全集成场景 文档中详细讨论了多种安全集成场景,例如SPNEGO...

    看懂App加载Class的顺序和Method的顺序.zip

    本资源"看懂App加载Class的顺序和Method的顺序.zip"似乎是一个开源项目,名为UIViewController-Swizzled-master,它可能是用来帮助开发者深入理解类加载机制并提供工具来跟踪和分析这个过程。 在Android系统中,类...

    WebSphere Application Server下Struts2.0无法使用解决方案

    WAS的类加载机制可能会影响第三方库的加载。确认应用的类加载顺序是否正确,避免类加载冲突。 9. **社区支持和官方文档**: 如果问题仍然存在,可以查阅Apache Struts和IBM WebSphere的官方文档,以及相关的...

    was7 安装部署(初级版)

    这是通过配置高速缓存来实现的,它能显著减少对同一资源的重复处理和数据加载。 Web响应监控主要关注应用程序的响应时间和性能瓶颈。通过对Web应用响应的监控,管理员可以快速发现并解决可能出现的性能问题,以保证...

    websphere下部署CXF项目jar包冲突问题解决方式

    冲突的根本原因在于WAS的类加载机制。默认情况下,WAS会优先使用其自身的类库,而非应用中提供的类库,即使应用中的类库版本可能更匹配。为了解决这个问题,我们可以采取以下步骤: 1. **删除冲突的JAR包**:首先,...

    如何在WebSphere中解决jar包冲突.doc

    * WebSphere lib/app Class loader:WebSphere 服务器类加载器,负责加载 WebSphere 安装目录下 $(WAS_HOME)/lib/app 路径上的类。 * WebSphere "server" Class loader:WebSphere 应用服务器类加载器,定义在这个...

    WAS 服务器性能警告原因分析

    ### WAS 服务器性能警告原因分析 #### 背景与问题描述 在7月16日,生产服务器出现了性能预警,具体表现为CPU使用率及内存使用率持续偏高。通过查看当时的日志,发现了内存不足(`OutOfMemoryException`)异常,并...

    spring-instrument-tomcat源码

    Spring Instrument Tomcat通过扩展Tomcat的类加载机制,使得Spring框架可以更深入地介入到应用程序的生命周期中。具体来说,它创建了一个名为`SpringContextClassLoader`的自定义类加载器,该加载器继承自Tomcat的...

    Hibernate延迟加载以及利用Spring

    在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正需要数据时才加载数据,而不是一开始就加载所有数据。这种策略能够有效地减少...

Global site tag (gtag.js) - Google Analytics