Java 多个应用程序内存泄漏

Java 多个应用程序内存泄漏,java,mysql,hibernate,solr,c3p0,Java,Mysql,Hibernate,Solr,C3p0,我在Tomcat 6.0.35服务器上的两个应用程序中出现了内存泄漏,看起来“不知从何而来”。一个应用是Solr,另一个是我们自己的软件。我希望有人以前见过这种情况,因为这在过去几周一直发生在我身上,我必须在生产环境中重新启动Tomcat 它出现在我们的原始服务器上,尽管与线程或DB连接操作相关的代码都没有被触及。由于运行该应用程序的旧服务器即将退役,我将该站点迁移到一个新服务器和一个“更干净”的环境中,以清除任何遗留内容。但这种情况仍在继续 就在Tomcat关闭之前,catalina.out日

我在Tomcat 6.0.35服务器上的两个应用程序中出现了内存泄漏,看起来“不知从何而来”。一个应用是Solr,另一个是我们自己的软件。我希望有人以前见过这种情况,因为这在过去几周一直发生在我身上,我必须在生产环境中重新启动Tomcat

它出现在我们的原始服务器上,尽管与线程或DB连接操作相关的代码都没有被触及。由于运行该应用程序的旧服务器即将退役,我将该站点迁移到一个新服务器和一个“更干净”的环境中,以清除任何遗留内容。但这种情况仍在继续

就在Tomcat关闭之前,catalina.out日志中充满了如下错误:

2012-04-25 21:46:00300[main]ERROR org.apache.catalina.loader.WebappClassLoader-web应用程序[/AppName]似乎已启动名为[MultiThreadedHttpConnectionManager cleanup]的线程,但未能停止该线程。这很可能会造成内存泄漏

2012-04-25 21:46:00339[main]ERROR org.apache.catalina.loader.WebappClassLoader-web应用程序[/AppName]似乎已启动名为[com.mchan]的线程 ge.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2],但未能停止它。这很可能会造成内存泄漏

2012-04-25 21:46:00470[main]ERROR org.apache.catalina.loader.WebappClassLoader-web应用程序[/AppName]仍在处理尚未完成的请求 伊什。这很可能会造成内存泄漏。您可以使用标准Conte的unloaddlay属性来控制请求完成所允许的时间 xt实现

在迁移过程中,我们从Solr1.4->Solr3.6尝试解决这个问题。当上面的错误开始填充日志时,下面的Solr错误紧随其后,重复10-15次,然后tomcat停止工作,我必须关闭并启动它才能做出响应

2012-04-25 21:46:00527[main]ERROR org.apache.catalina.loader.WebappClassLoader-web应用程序[/solr]使用[org.a]类型的键创建了ThreadLocal pache.solr.schema.DateField.ThreadLocalDateFormat](值[org.apache.solr.schema.DateField$ThreadLocalDateFormat@1f1e90ac])和类型为[org.apache.solr]的值。 schema.DateField.ISO8601CanonicalDateFormat](值[org.apache.solr.schema.DateField$ISO8601CanonicalDateFormat@6b2ed43a])但当web服务器停止运行时,无法将其删除 申请已停止。这很可能会造成内存泄漏

我的研究已经提出了很多关于更改管理线程的代码的建议,以确保它们杀死数据库池连接等。但是这段代码已经有近12个月没有更改了。此外,Solr应用程序正在崩溃,这是第三方,所以我认为这是环境问题(jar冲突、版本控制、配置胖指?)

我的最后一个更改是将mysql connector for java更新为最新版本,因为早期版本中的池存在一些内存泄漏错误,但服务器只是在几个小时后再次崩溃

我刚刚注意到的一件事是,我在TomcatWeb管理器中看到了数千个会话,但这可能是一个骗局

如果有人看到这一切,我们将非常感谢您的帮助

[编辑]

我想我找到了问题的根源。这毕竟不是内存泄漏。我已经从另一个开发团队那里接管了一个应用程序,该开发团队通过Hibernate用于数据库池。c3p0有一个bug/特性,如果不释放DB connections,那么一旦使用了所有连接(通过MaxPoolSize:默认值为15),c3p0就会进入等待状态。它将无限期地等待连接可用。因此我的摊位

我首先将MaxPoolSize从25->100调高,我的应用程序运行了几天没有挂起,然后从100->1000调高,此后一直稳定运行(超过2周)

这不是一个完整的解决方案,因为我需要找出池连接用尽的原因,所以我还将c3p0的unreturnedConnectionTimeout设置为4hr,这将强制所有连接都有4hr的时间限制,无论它们是否处于活动状态。如果是活动连接,则会将其关闭,然后重新打开

不漂亮,我不推荐,但它给了我一些喘息的空间来找出问题的根源


注意:将c3p0与Hibernate一起使用时,设置存储在persistence.xml文件中,但并非所有设置都可以放在那里。某些设置(例如unreturnedConnectionTimeout)必须进入

如果您声明事件顺序为:

  • 出现错误
  • Tomcat停止响应
  • 需要重新启动
但是,只有当web应用程序停止时,才会报告内存泄漏错误消息。因此,有东西触发web应用程序停止(或重新加载)。你需要弄清楚是什么触发了这一切并阻止它

关于实际泄漏,您可能会发现这一点很有用:


看起来你的应用程序和Solr都有一些漏洞需要修复。本演示将为您提供一些提示。我也会考虑升级到最新的7。内存泄漏检测得到了改进,但并非所有的改进都使其成为6.0.x版本。

尝试在jdk中使用jvisualvm观察tomcat jvm。感谢Thorbjørn。我让jvisualvm在一夜之间运行,但没有什么突出的地方。GC按预期进行,堆空间充足(使用了约30%,最多使用了50%),PermGen很好(使用了约30%)。我没有为远程访问配置JMX,所以我没有得到完整的信息。我关闭了jvisualvm开车上班,30分钟后接到一个电话,说该网站在头版提供服务,但任何数据库访问(登录/搜索)都再次停止。很奇怪,solr上似乎有一个类似的未决问题尚未解决Hanks Mark,我接受了你的建议,转到了TC7,但随着你的要求