Java 长时间运行Tomcat进程的类加载器中的问题

Java 长时间运行Tomcat进程的类加载器中的问题,java,tomcat,classloader,Java,Tomcat,Classloader,我们在Tomcat 6.0.18上托管了web应用程序,遇到了以下问题: 有两个web应用程序WebApp1和WebApp2,它们都是相同的系统,但版本不同 现在的问题是,当tomcat运行了一周或更长的时间后,有时系统会给出NoClassDefFoundError!此外,我们还遇到了一些奇怪的问题,WebApp1的类加载器加载了WebApp2的jar中的类!WebApp1中也存在相同的jar,但版本不同 当我们重新启动Tomcat时,一切都开始正常工作!我们的JRE是1.5.10 如果您遇到此

我们在Tomcat 6.0.18上托管了web应用程序,遇到了以下问题:

有两个web应用程序WebApp1和WebApp2,它们都是相同的系统,但版本不同

现在的问题是,当tomcat运行了一周或更长的时间后,有时系统会给出NoClassDefFoundError!此外,我们还遇到了一些奇怪的问题,WebApp1的类加载器加载了WebApp2的jar中的类!WebApp1中也存在相同的jar,但版本不同

当我们重新启动Tomcat时,一切都开始正常工作!我们的JRE是1.5.10

如果您遇到此类问题,请告诉我

问候,,
Jatan Porecha

我在Tomcat中遇到了许许多多奇怪的类加载器-即使您自己不执行任何类加载器代码,Tomcat本身也很容易产生问题。最常见的问题似乎是反复卸载和重新加载webapp会泄漏类加载器,并最终耗尽内存运行Tomcat

我所看到的版本不匹配的最常见原因是Tomcat确保某些类和JAR(Tomcat本身的一部分)在webapp类路径中领先于任何其他类-commons日志记录似乎是最常见的例子-并且类加载器可以在您不期望的情况下加载、卸载或保留


你能提供更多的细节吗?如果这个罐子来自第三方,很有可能有人以前见过这个问题。如果是您自己的jar,那么您在应用程序中有自己的类加载器代码吗?

感谢Chris的回复

jar已经成为系统的一部分,并且拥有一些由其他进程共享的公共类

让我们调用jar comutils.jar,这样的场景就像

WebApp1 (ver 1) | |- comutils.jar (ver 1) | |- MailSender.class (ver 1) WebApp2 (ver 2) | |- comutils.jar (ver 2) | |- MailSender.class (ver 2) WebApp1(第1版) | |-comutils.jar(第1版) | |-MailSender.class(版本1) WebApp2(第2版) | |-comutils.jar(第2版) | |-MailSender.class(第2版) 这个MailSender类是singleton

现在,有时发生的情况是,每当WebApp1的代码在使用getInstance方法检索其实例后调用MailSender的任何方法时,实际上调用的是MailSender(版本2),而不是版本1


希望这能给你一些线索。

我仍然没有足够的代表添加评论,所以我必须发布另一个答案。:)

这听起来像是MailSender.class被加载到Tomcat中,而不是每个单独的webapp中。WebApp2首先加载它,它就工作了,即使它被加载到所有Tomcat中,而不是WebApp2专用的。当WebApp1需要该类时,它已经看到它已加载到Tomcat父类中,并且不会尝试将一个私有类加载到WebApp1


我首先建议你检查一下你的Tomcat,JRE等等。。。目录,以查看这些路径中是否存在jar或类的副本。之后,我将手动从两个jar文件中删除该类,并重新启动Tomcat或web应用程序,以查看发生了什么情况—您可能希望它失败并生成堆栈跟踪,这将告诉您第一次加载该类的位置以及试图加载该类的用户。(例如,从类名来看,您可能有一个邮件API,加载到Tomcat JVM中,该API将类加载到Tomcat中,而不是加载到您的webapp中)。

您在同一台服务器上托管两个版本的完全相同的代码有什么特殊原因吗


有两个完全相同名称的不同JAR,包含相同命名空间中的类,并且具有相同的类名,这似乎会导致各种问题(其中最重要的是人为错误).

我认为,与Tomcat类加载器突然从类路径外部加载类相比,您更有可能在WebApp1的类路径中部署了一个额外版本的comutils.jar。。。检查MailSender.class是否仅位于一个位置。是的,我们已检查并验证两个JAR是否不同,是否放置在不同的Web应用程序中。。