【问题标题】:ClassNotFoundException in tomcat for an inner class in servlet codeservlet代码中的内部类的tomcat中的ClassNotFoundException
【发布时间】:2013-02-18 04:13:00
【问题描述】:

我们有一个 web 应用程序,其实例在同一个 tomcat (v6.0.14) 实例下多次部署。假设war文件名为“app.war”,那么我们部署“app1.war”、“app2.war”等。

所有应用程序实例 (~20) 都已正确部署。当访问这些应用程序上的 servlet 时,有时它们会因 Tomcat 的 WebAppClassLoader 中的 ClassNotFoundException 导致的 NoClassDefFoundError 而失败。以下是一个例子-

java.lang.NoClassDefFoundError: com/xxx/APISocketServer$ClientRequestHandler
    at com.xxx.APISocketServer$APISocketServerThread.run(APISocketServer.java:143)
Caused by: java.lang.ClassNotFoundException: com.xxx.APISocketServer$ClientRequestHandler
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1358)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
    ... 1 more

违规类是应用程序代码的一部分,而不是任何库的一部分。

由于某些应用程序实例运行正确,这不可能是类路径配置错误的情况。需要注意的一点是,只有几个类无法加载。这些类没有任何静态初始化程序块,这可能导致类初始化失败。我检查了tomcat日志(catalina.out、localhost.log),没有发现任何类初始化错误。

我应该如何继续调试这个问题?

【问题讨论】:

  • 发布显示这两个错误的堆栈跟踪。否则,我们将取决于您对问题的解释。
  • @JimGarrison 我在问题中添加了例外。
  • Java 版本是否正确?这些错误经常发生在损坏或不正确的 JDK 版本中。尝试将 JAVA_HOME 设置为另一个 JDK。
  • Tomcat 在 JRE1.6U22 下运行,JRE 安装正确且无损坏。我已经用另一个系统验证了 java 目录中文件的 md5sums。最大堆大小为 4g,最大 perm 大小为 1g。系统有足够的 RAM (16g) 以避免任何内存限制。

标签: tomcat classnotfoundexception


【解决方案1】:

经过进一步调查,发现打开文件描述符的限制 (1024) 是罪魁祸首。每个应用程序实例都需要由其类加载器 (WebappClassLoader) 打开的 Jar 文件的自己的副本。如果 90 秒内未访问 Jar 文件中的类,则类加载器将关闭文件。如果在短时间内访问多个应用程序实例,openJARs 函数将失败,导致类无法加载。

如果WebappClassLoader 记录了在更高日志级别打开 JAR 文件的失败,则该错误会更早发现。错误记录在调试级别。为WebappClassLoader 启用调试级别有助于解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    相关资源
    最近更新 更多