`

WebSphere的类加载机制和故障排查

阅读更多

(转自:http://www.hashei.me/2009/05/websphere-class-loader-troubshooting.html

 

在部署WebSphere应用的过程中,经常会发生诸 如:ClassCastException、ClassNotFoundException、NoClassDefFoundException、 UnsatisfiedLinkError的错误。这种有关“类”(Class)的错误,往往来无影——开发环境好的,怎么在生产环境就有问题;而且去无 踪——单独建立一个Profile部署一下就没问题了,把Jar包换个目录就OK了。其实要解决这些怪异的问题,首先要了解WebSphere的类加载 (Class loader)机制。

下文主要内容来自http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/welcome_nd.html 和IBM developworks中的《如何在WebSphere中解决jar包冲突》一文,我把个人觉得最容易理解的部分总结在一起,方便学习和快速的解决问题。

使用的类装入器以及使用顺序

WebSphere Application Server 的运行时环境按以下顺序使用下列类装入器来查找和装入应用程序的新类:

  1. Java 虚拟机创建的引导程序、扩展和 CLASSPATH 类装入器引导程序类装入器使用引导类路径(通常是 jre/lib 中的类)找到并装入类。扩展类装入器使用系统属性 java.ext.dirs(通常是 jre/lib/ext )找到并装入类。CLASSPATH 类装入器使用 CLASSPATH 环境变量查找和装入类。CLASSPATH 类装入器装入 WebSphere Application Server 产品在 j2ee.jar 文件中提供的 Java 2 Platform, Enterprise Edition(J2EE)应用程序编程接口(API)。由于这个类装入器装入 J2EE API,所以,可以将依赖于 J2EE API 的库添加到类路径系统属性中以扩展服务器类路径。但是,扩展服务器的类路径的首选方法是添加共享库
  2. WebSphere 扩展类装入器WebSphere 扩展类装入器装入在运行时需要的 WebSphere Application Server 类。扩展类装入器使用 ws.ext.dirs 系统属性来确定装入类时所使用的路径。ws.ext.dirs 类路径中的每个目录和这些目录中的每个 Java 归档(JAR)文件或 ZIP 文件都添加到此类装入器使用的类路径中。如果安装在服务器上的应用程序模块引用了与资源提供程序相关联的资源,并且该提供程序指定了资源驱动程序的目录名 称,那么 WebSphere 扩展类装入器还将资源提供程序类装入到服务器中。
  3. 一个或多个应用程序模块类装入器,它们负责装入在服务器中运行的企业应用程序的元素应用程序元素可以是 Web 模块、企业 bean(EJB)模块、资源适配器归档(RAR 文件)和依赖项 JAR 文件。应用程序类装入器按照 J2EE 类装入规则从企业应用程序装入类和 JAR 文件。WebSphere Application Server 允许使共享库与应用程序相关联。
  4. 零个或多个 Web 模块类装入器缺省情况下,Web 模块类装入器装入 WEB-INF/classes 和 WEB-INF/lib 目录的内容。Web 模块类装入器是应用程序类装入器的子代。可以指定使用应用程序类装入器来装入 Web 模块的内容,而不是使用 Web 模块类装入器来装入这些内容。

class loader

关于WebSphere的类加载器的层次结构,以下的几点说明可能更有助于进一步的理解类的查找和加载过程:

  • 每个类加载器负责在自身定义的类路径上进行查找和加载类。
  • 一个子类加载器能够委托它的父类加载器查找和加载类,一个加载类的请求会从子类加载器发送到父类加载器,但是从来不会从父类加载器发送到子类加载器。
  • 一旦一个类被成功加载,JVM 会缓存这个类直至其生命周期结束,并把它和相应的类加载器关联在一起,这意味着不同的类加载器可以加载相同名字的类。
  • 如果一个加载的类依赖于另一个或一些类,那么这些被依赖的类必须存在于这个类的类加载器查找路径上,或者父类加载器查找路径上。
  • 如果一个类加载器以及它所有的父类加载器都无法找到所需的类,系统就会抛出ClassNotFoundExecption异常或者NoClassDefFoundError的错误。

类装入器隔离策略

WebSphere中对类加载器有一些相关的配置,称为类加载器策略(class loader policy)。类加载器策略指类加载器的独立策略(class loader isolation policy),通过类加载器策略设置,我们可以为WAS和应用程序的类加载器进行独立定义。

每个WAS可以配置自己的应用程序类加载器策略,WAS中的每个应用程序也可以配置自己的Web模块类加载器策略,下面我们对这两种策略分别介绍。

1.应用服务器(WAS)配置:应用程序类加载器策略

应用服务器对应用程序类加载器策略有两种配置:

  • Single:整个应用服务器上的所有应用程序使用同一个类加载器。在这种配置下,每个应用程序不再有自己的类加载器。
  • Multiple:应用服务器上的每个应用程序使用自己的类加载器。

2.应用程序配置:Web模块类加载器策略

应用程序中对Web模块类加载器有两种配置:

  • Application:整个应用程序内的所有的实用程序jar包和Web模块使用同一个类加载器。
  • Module:应用程序内的每个Web模块使用自己的类加载器。应用程序的类加载器仍然存在,负责加载应用程序中Web模块以外的其它类,包括所有的实用程序jar包。

从上面的定义可以看出,不同的类加载器策略的配置下,类加载器的层次结构上的某些类加载器可能不存在。比如在应用程序服务器的应用程序类加载器策略 定义为single的情况下,应用程序的类加载器将不存在,同一个应用服务器上的所有应用程序将共用同一个类加载器,这也就意味着不同的应用程序之间的类 是共享的,应用程序间不能存在同名的类。

类装入器方式

类加载器有一个重要的属性:委托模式(Delegation Mode,有时也称为加载方式:Classloader mode)。委托模式决定了类加载器在查找一个类的时候, 是先查找类加载器自身指定的类路径还是先查找父类加载器上的类路径。

类加载器的委托模式有两个取值:

  • Parent_First:在加载类的时候,在从类加载器自身的类路径上查找加载类之前,首先尝试在父类加载器的类路径上查找和加载类。
  • Parent_Last:在加载类的时候,首先尝试从自己的类路径上查找加载类,在找不到的情况下,再尝试父类加载器类路径。

有了委托模式的概念,我们可以更加灵活的配置在类加载器的层次结构中类的加载和查找方式。表1中给出了在WebSphere的类加载器层次结构中各个类加载器的委托模式的定义,并给出了不同的类加载器内类的生命周期。

class loader2

问题解答

具体分析引起jar包冲突的情况,主要有三种:

  • 多个应用程序间jar包冲突:多个应用程序间由于使用了共享jar包的不同版本而造成jar包版本冲突。
  • 应用程序中多个Web模块间jar包冲突:同一个应用程序内部,不同的Web模块间同时使用一个jar包的不同版本而造成jar包版本冲突。
  • 应用程序中同一个Web模块内jar包冲突:同一个应用程序内部,同一个Web模块内,由于需要同时使用同一个jar包的两个版本而造成的jar包冲突

本部分根据这三种jar包冲突的情况,讨论三种解决jar包冲突的办法,并具体讨论三种解决办法的实现步骤和适用情况:

  • 共享库方式解决jar包冲突:主要解决应用程序间的jar包冲突问题
  • 打包到Web模块中解决jar包冲突:主要解决应用程序中多个Web模块间jar包冲突问题
  • 命令行运行方式解决jar包冲突:主要解决应用程序中同一个Web模块内jar包冲突问题

详细操作过程参考《如何在WebSphere中解决jar包冲突》一文

扩展阅读

类装入器

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.base.doc/info/aes/ae/crun_classload.html

类装入异常

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/rtrb_classload_viewer.html

类装入器查看器设置(排查重要工具)

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/utrb_classload_viewer.html

 

分享到:
评论

相关推荐

    山大WebSphere考试题

    8. **故障排查与维护**: - 通过日志分析、性能监控、JVM诊断工具等方法,可以定位和解决WebSphere中的问题。 - 定期备份和恢复策略对于保持系统的稳定性和数据完整性至关重要。 - 确保及时安装IBM发布的补丁和...

    Websphere 中生成日志问题

    这种情况往往源于日志框架配置不完整或WebSphere特有的类加载机制冲突,下面将详细介绍解决方案。 ### 解决方案详解 #### 1. 修改commons-logging.jar 首先,需要对commons-logging.jar进行修改,这是为了让...

    java IBM websphere 内存溢出 javacore deapdump CPU内存分析工具

    总结来说,面对Java IBM WebSphere的内存溢出问题,我们需要结合`javacore`和`deapdump`等诊断工具,通过分析脚本和相关库文件,理解内存管理原理,调整JVM配置,并优化代码,才能有效地排查和解决问题。

    IBM演示-WebSpherePortal教程

    - **日志和跟踪**:详细的日志记录和跟踪功能,用于故障排查和性能分析。 - **管理工具**:提供图形化管理控制台,方便管理员进行配置、监控和更新。 9. **社交协作** - **社区功能**:用户可以创建和加入社区,...

    Websphere Application Server 6 配置与管理

    配置与管理Websphere Application Server涉及多个层面,包括服务器实例的创建、应用程序的部署、安全管理、性能监控和故障排查等。 1. **服务器实例的创建**:在Websphere中,一个服务器实例代表了一个独立运行的...

    WEBSphere5.0部署文档

    - **监控和诊断**:提供实时监控工具和故障排查指南。 ##### 3.3 常见问题及解决方法 - **启动服务器失败**: - 检查服务器配置是否正确。 - 确保没有其他服务占用相同的端口。 - **应用程序部署失败**: - ...

    IBM WebSphere DataStage Advanced Enterprise Edition

    3. **故障排查**:当遇到问题时,应充分利用日志记录和监控工具来定位问题原因,并采取相应措施解决。 4. **培训与支持**:为了更好地利用 DataStage 的功能,建议对团队成员进行专业培训,并保持与 IBM 技术支持...

    Websphere Application Server Tuning Guide on HP Integrity

    6. **基本 Java 性能调整**:了解和利用 Java 虚拟机(JVM)的各种特性,如垃圾回收策略、类加载机制等,可以帮助开发者更有效地管理应用资源。 7. **基本 J2EE 性能调整**:针对 J2EE 架构的特点,采取一些最佳...

    WebSphere快速入门

    - 上传部署:在WebSphere管理控制台中选择部署选项,上传并配置你的应用,指定上下文根、类加载器策略等。 - 启动应用:部署完成后,启动服务器实例,你的应用将自动启动。 5. **安全管理** - 用户认证:配置...

    WebSphere+Application+Server+常见问题及解答

    因此,建议尽量利用WAS内置的多线程支持和类加载机制。 **7. 在多个独立的WebSphere应用程序服务器环境中,一个服务器上的应用程序该如何访问运行在其他服务器上的应用程序?** 在多个独立的WebSphere应用程序...

    IBM WebSphere Appication Server 内部学习资料

    你将了解到如何通过管理控制台或命令行工具进行实例管理、资源分配、故障排查,以及如何进行备份与恢复操作。此外,这部分可能还会涉及网络部署模型,理解不同部署模式下的优势和应用场景。 P03-WASv6.1-Packaging ...

    WebSphere Application Server6_0无人执守部署

    7. **监控与日志**:无人执守部署还包括自动化监控和日志管理,确保问题发生时能够及时发现并进行故障排查。 8. **回滚策略**:当部署失败或出现问题时,有一个可靠的回滚策略是必要的。无人执守部署应当包含错误...

    webpsphere教程合集,对你肯定有帮助

    11. **故障排查** 当遇到问题时,日志分析、跟踪设置、诊断工具的使用是排查问题的有效手段。理解如何读取和解读WebSphere的日志信息,能快速定位并解决问题。 通过学习本教程合集,你将能够熟练掌握WebSphere的...

    dojo version 1.0 websphere 6 workable sample

    ##### 四、故障排除 1. **调试器**: - 使用调试工具可以帮助开发者定位和解决问题。 2. **客户端日志记录**: - 通过在客户端记录日志信息,可以更好地追踪问题发生的上下文环境。 3. **将日志消息发送到服务器...

    Server Based Java Programming (Manning).pdf

    - **日志管理**:合理记录和分析日志可以帮助快速定位问题原因,是故障排查的重要手段。 综上所述,《Server Based Java Programming》这本书覆盖了从基础概念到高级实践的广泛内容,对于希望深入学习服务器端Java...

    连接池小解

    此外,连接池还需要处理连接的生命周期管理,如连接超时、自动检测失效连接并回收,以及监控连接池的使用状况,以便进行性能优化和故障排查。连接池的这些特性使得它成为了现代Web应用中提高数据库访问性能和稳定性...

    IBM DB2 Q复制原理培训

    6. **Replication Monitor和Replication Center**:提供监控和管理工具,允许管理员查看复制状态,进行故障排查和性能优化。 7. **数据发布**:除了数据复制,Q复制还支持将数据以XML格式发布,供外部应用程序使用...

    tomcat

    - JVM调优:合理设置JVM堆大小(-Xms, -Xmx),开启垃圾回收策略,优化类加载机制。 - 部署优化:将静态资源分离,减少对Servlet的请求,启用GZIP压缩等。 5. **安全与防火墙配置** - 防止目录浏览:在web.xml中...

    DB2 dba 手册

    7. **故障排查与问题诊断**:DB2的日志和诊断工具可以帮助DBA识别并解决各种运行时问题,如错误代码解析、性能瓶颈定位等。 8. **高可用性与灾难恢复**:DB2支持高可用性特性如镜像、集群和纯度复制,以保证服务不...

    IBM Java JVM Diagnostic Guide

    - **Class Loader**:加载类和资源的组件。 - **Interpreter**:解释执行Java字节码的组件。 - **Platform Port Layer**:将JVM连接到特定硬件平台的接口层。 ##### 第2章:理解垃圾收集器 - **内存管理概述**...

Global site tag (gtag.js) - Google Analytics