- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个网络应用程序,其实例在同一个 tomcat (v6.0.14) 实例下多次部署。假设war文件名为“app.war”,那么我们部署“app1.war”、“app2.war”等。
所有应用程序实例 (~20) 都已正确部署。当访问这些应用程序上的 servlet 时,有时它们会因 NoClassDefFoundError
而失败,这是由 tomcat 的 WebAppClassLoader
中的 ClassNotFoundException
引起的。以下是一个示例 -
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
有问题的类是应用程序代码的一部分,而不是任何库的一部分。
由于某些应用程序实例运行正常,这不可能是类路径配置错误的情况。需要注意的一件事是只有几个类无法加载。这些类没有任何静态初始化程序 block ,这可能会导致类初始化失败。我已经检查了 tomcat 日志(catalina.out、localhost.log)并没有发现任何类初始化错误。
我应该如何继续调试这个问题?
最佳答案
经过进一步调查,发现打开文件描述符的限制 (1024) 是罪魁祸首。每个应用程序实例都需要由其类加载器 (WebappClassLoader
) 打开的 Jar 文件副本。如果 Jar 文件中的类在 90 秒内未被访问,类加载器将关闭文件。如果在短时间内访问多个应用程序实例,openJARs
函数将失败,导致类无法加载。
如果 WebappClassLoader
在更高的日志级别记录了打开 JAR 文件的失败,则可以更早地发现错误。错误记录在调试级别。为 WebappClassLoader
启用调试级别,有助于找出问题。
关于tomcat - 对于 servlet 代码中的内部类,tomcat 中的 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15195367/
我是一名优秀的程序员,十分优秀!