对类装入器进行故障诊断

类装入器查找并装入类文件。 为了使部署的应用程序能够正确运行,必须对影响该应用程序及其模块的类装入器进行配置,以使该应用程序能够找到它所需的文件和资源。 类装入器问题的诊断工作可能相当复杂并且耗时。 为了更快地诊断和解决问题,请使用管理控制台的“类装入器查看器”来检查类装入器和每个类装入器装入的类。

准备工作

本主题假定您已将应用程序安装在该产品支持的服务器上,并且要检查应用程序或其模块使用的类装入器。 模块可以是 Web 模块(.war 文件)或企业 Bean (EJB) 模块(.jar 文件)。 “类装入器查看器”使您能够在运行时环境中检查类装入器。

本主题还假定您已启用类装入器查看器服务。 单击 服务器 > 服务器类型 > WebSphere Application Server > server_name > 类装入器查看器服务,启用该服务并重新启动服务器。

有关此任务

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

  1. Java 虚拟机创建的引导程序、扩展和 CLASSPATH 类装入器
  2. WebSphere 扩展类装入器
  3. 一个或多个应用程序模块类装入器,他们负责装入在服务器中运行的企业应用程序的元素
  4. 零个或多个 Web 模块类装入器
类装入器层次结构

每个类装入器都是上一个类装入器的子代。 即,应用程序模块类装入器是 WebSphere 扩展类装入器的子代,而后者是 CLASSPATH Java 类装入器的子代。 每当需要装入一个类时,类装入器通常将请求委派给它的父类装入器执行。 如果没有任何父类装入器能够找到该类,那么原始类装入器就会尝试装入该类。 请求只能转至父类装入器;他们不能转至子类装入器。 在类装入器装入一个类后,它尝试装入的任何新类都会重复使用同一类装入器或沿优先顺序列表查找,直到找到该类为止。

如果未正确配置负责装入应用程序工件的类装入器,Java 虚拟机 (JVM) 在启动或运行该应用程序时就可能会抛出类装入异常。 类装入异常 描述了由未正确配置的类装入器引起的异常类型,并建议使用类装入器查看器来更正类装入器配置的方法。 异常类型包括:

使用“类装入器查看器”来检查类装入器并解决应用程序或类装入器配置问题。

过程

  • 检查列示了所有已安装的应用程序及其模块的树形视图。 这些模块可以是 Web 模块 (.war 文件) 或 EJB 模块 (.jar 文件)。

    单击 故障诊断 > 类装入器查看器 以访问 企业应用程序拓扑页面

  • 检查类装入器委派层次结构。

    在“企业应用程序拓扑”页中,选择一个模块以访问“类装入器查看器”页。 该页面列示了对已安装的企业应用程序中的 Web 和 EJB 模块可视的类装入器。 此页面帮助您确定装入了模块文件的类装入器以及诊断类装入器问题。

    委派层次结构由对应用程序或 Web 模块指定的类装入器委派方式或类装入器顺序确定。 值可以是 Classes loaded with parent class loader firstClasses loaded with local class loader first (parent last)。 请参阅 配置类装入器 步骤以获取更多信息。

  • 导出有关类装入器的信息。
    1. 在 " 类装入器查看器" 页面上,单击 导出
    2. 进行选择,以便对类装入器信息打开浏览器或编辑器,或者按 XML 格式将该信息保存到磁盘中。
    3. 单击 确定,然后指定系统请求的任何其他信息。
  • 使用 HTML 表格式显示关于对模块可视的类装入器的信息。

    在 " 类装入器查看器" 页面上,单击 表视图。 “表视图”页将显示以下信息。

    表 1. "表视图" 页面 有关类装入器属性的可用信息
    类装入器属性 描述
    授权 指示类装入器是否将模块的装入工作委派给它的父类装入器执行。 值 true 表示正在使用父应用程序的类装入器 (Classes loaded with parent class loader first)。 值 false 表示正在使用模块类装入器 (Classes loaded with local class loader first (parent last))。 请参阅 配置类装入器 步骤以获取更多信息。
    类路径 列示类装入器搜索类和资源时使用的路径。
    列示 JVM 中由这个类装入器装入的类的名称。

    如果发生了内存不足错误,表视图选项就不会返回值。 内存不足错误可能与内存泄漏相关。 要检查关于表中类装入器的信息,必须先解决内存不足问题,然后再次单击表视图

  • 搜索类装入器。
    在 "类装入器查看器" 页面上,单击 搜索 以访问 "搜索" 页面,您可以在该页面上搜索类装入器以查找以下内容:
    • 特定字符串
    • 特定 .jar 文件
    • 特定目录中的文件名
    • 特定类装入器装入的文件名
    此搜索区分大小写。 类装入异常 描述了 "搜索" 页面的多种用途。
  • 配置类装入器。
    可以为下列各项配置类装入器:

    类装入器配置确定哪个类装入器装入应用程序或 Web 模块的类和资源文件。 应用程序和 WAR 模块类装入器配置设置包括类装入器顺序WAR 类装入器策略

    类装入器顺序 值可以是 Classes loaded with parent class loader firstClasses loaded with local class loader first (parent last)。 缺省值为 Classes loaded with parent class loader first。 具有 Classes loaded with parent class loader first 方式的类装入器在搜索其类路径之前将类或资源的装入委托给其直接父类装入器。

    对类装入问题进行故障诊断时,可能需要覆盖对父类装入器可视的类。 要使用特定于应用程序的类覆盖此类类,请在其类路径上包含应用程序类的类装入器上将 类装入器顺序 设置为 Classes loaded with local class loader first (parent last) 。 应用程序可以覆盖对父类装入器可视的类,但这样做的话,在混合使用被覆盖的类和未被覆盖的类时可能会导致 ClassCastException 或 UnsatisfiedLinkError。

    例如,在缺省类装入器策略下, Web 模块有自己的 Web 模块 (WAR) 类装入器来装入其工件,这些工件通常位于WEB-INF/classesWEB-INF/lib目录。 应用程序模块类装入器是这个 WAR 类装入器的直接父代。 要确保 Web 模块类装入器先在这些路径中搜索特定类或资源,在将装入操作委派给应用程序模块类装入器之前,请将 Web 模块的 类装入器顺序 设置为 Classes loaded with local class loader first (parent last)

    类装入器策略确定了应用程序模块类装入器和 WAR 模块类装入器的结构。 在缺省策略下,运行的每个应用程序 EAR 都有自己的应用程序模块类装入器,并且每个 Web 模块都有自己的 WAR 模块类装入器。 缺省策略确保应用程序工件之间的可视性和隔离方面的 Java EE 一致性。 在对类装入问题进行故障诊断时,建议不要更改缺省策略。

下一步做什么?

如果继续存在类装入器问题,请参阅 类装入异常类装入