jakarta-ee - Tomcat 5.5 和 Tomcat 6.0 中的 ClassNotFoundException 错误

标签 jakarta-ee tomcat tomcat6 tomcat7 tomcat5.5

我在使用 tomcat 5.5 和 tomcat 6.0 服务器时遇到了这个奇怪的问题。我有两个将安装在 tomcat 上的 Web 应用程序。当启动 tomcat 时,这两个 Web 应用程序也会同时启动,但有时一个 Web 应用程序无法初始化,因为一个应用程序中的初始化失败,另一个应用程序在运行时出现 classnotfoundexception 错误。在 tomcat 7.0 中,即使其他应用程序未能初始化,该应用程序也能正常运行。

经过一些调试后,我开始知道有一个名为 crystal.jar 的 jar,它位于两个应用程序的 web-inf/lib 文件夹中。我已将 jar 移动到 tomcat 的 common/lib 文件夹,然后它开始正常工作。我想知道为什么它在 tomcat 7.0 中运行良好,而在 tomcat 5.x 和 tomcat 6.x 版本中运行良好。这些版本之间的类加载架构是否有任何变化?

谢谢

EDIT1: 该库位于两个应用程序的 WEB-INF\lib 目录中,它们与外部 DLLS 没有依赖关系。刚才我阅读了有关 tomcat 5.5 类加载器体系结构的信息,并了解到每个 Web 应用程序都有自己的类加载器。 WEB-INF\lib 文件夹和 classes 文件夹中的库将被加载到这个类加载器中。存储在公共(public)目录下的库将被放入共享类加载器中。然后这个库应该在 web 应用程序的单独类加载器中单独加载。即使一个 Web 应用程序无法启动,其他 Web 应用程序也应该独立工作。这就是为什么我感到奇怪并需要进一步调查的原因。

最佳答案

终于找到了这个问题的答案

存在一种已知的 PermGen 内存泄漏,当库类 被系统类引用,因此存在于它的年龄之外。一 例如,当 Java 发现 JDBC 驱动程序或其他一些服务时 并“自动注册”它。它在一个 系统,但类本身属于 web 应用程序,必须 当应用程序停止时被卸载 - 但不能,因为那个 引用。并非所有此类引用资料都易于清除。

这种情况下的一个典型症状是第一个 Web 应用程序 依赖此系统功能的将成功,但第二个和 其他的将失败(因为在 系统属于第一个 Web 应用程序,看不到来自 第二个应用程序的类加载器,反之亦然)。

Tomcat 7 和最近版本的 Tomcat 6 有更好的保护 在默认情况下防止某些已知的 PermGen 内存泄漏 配置。

Tomcat 5.5 根本没有这种保护。

编辑一些引用资料

http://people.apache.org/~markt/presentations/2010-08-05-Memory-Leaks-JavaOne-60mins.pdf http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf

http://eclipse.org/mat/

http://wiki.apache.org/tomcat/FAQ/Troubleshooting_and_Diagnostics http://wiki.apache.org/tomcat/MemoryLeakProtection

关于jakarta-ee - Tomcat 5.5 和 Tomcat 6.0 中的 ClassNotFoundException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10937935/

相关文章:

java - 如何使用 IP 地址从另一台机器运行 java 动态 Web 项目

java - 使用servlet在浏览器中禁用返回功能

Hibernate 如何有效地处理 100.000+ 个实体更新

sql - 数据库链接连接超时

java - context.xml 和 server.xml 之间的区别?

java - Red Hat Tomcat 7容器上java的Heapsize等内存配置

eclipse - Tomcat项目清理报错

tomcat - 从 Netbeans 运行时,Tomcat 6 的 SSl 不起作用

Java EE 共享库?

java - 单点登录成功登录后重定向到不同的 URL