Tomcat 5.5和Tomcat 6.0中的ClassNotFoundException错误

7
我遇到了一个奇怪的问题,涉及到Tomcat 5.5和Tomcat 6.0服务器。我有两个Web应用程序将被安装在Tomcat上。当Tomcat启动时,这两个Web应用程序同时启动,但有时一个Web应用程序无法初始化,因为其中一个应用程序的init失败,另一个应用程序在运行时会出现classnotfoundexception错误。在Tomcat 7.0中,即使另一个应用程序无法初始化,该应用程序也可以正常运行。
经过一些调试,我知道有一个名为crystal.jar的jar文件,位于两个应用程序的web-inf / lib文件夹中。我已将该jar文件移动到Tomcat的common / lib文件夹中,然后它开始正常工作。我想知道为什么在Tomcat 5.x和Tomcat 6.x版本中不能正常工作,而在Tomcat 7.0中可以正常工作。这些版本之间是否有类加载架构方面的变化?
谢谢
编辑1:该库位于两个应用程序WEB-INF \ lib目录的位置,并且它们不依赖于外部DLLS。刚刚我阅读了关于Tomcat 5.5类加载器架构的信息,并了解到每个Web应用程序都有自己的类加载器。 WEB-INF \ lib文件夹和classes文件夹中的库将加载到此类加载器中。存储在common目录下的库将放置在共享类加载器中。然后,此库应在Web应用程序的单独类加载器中单独加载。因此,即使一个Web应用程序无法启动,其他Web应用程序也应该可以独立工作。这就是为什么我感到奇怪并需要进一步调查的原因。
1个回答

6

终于找到了解决这个问题的方法

存在一种已知的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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接