多个应用中的内存泄漏

时间:2012-04-25 21:49:21

标签: java mysql hibernate solr c3p0

我在Tomcat 6.0.35服务器中的两个应用程序中出现内存泄漏,这些应用程序“无处不在”。一个应用程序是Solr,另一个是我们自己的软件。我希望有人之前看过这个,因为过去几周我一直在发生这种情况,我必须在生产环境中继续重启Tomcat。

它出现在我们的原始服务器上,尽管事实上没有触及与线程或数据库连接操作相关的代码。由于这个应用程序运行的旧服务器已经退役,我将网站迁移到新服务器和“更清洁”的环境,其想法可以清除任何遗留的东西。但它仍在继续发生。

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

  

2012-04-25 21:46:00,300 [main]错误org.apache.catalina.loader.WebappClassLoader- Web应用程序[/ AppName]似乎已经启动了一个名为[MultiThreadedHttpConnectionManager cleanup]但未能停止的线程它。这很可能会造成内存泄漏。

     

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

     

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

在迁移期间,我们从Solr 1.4-> Solr 3.6开始尝试解决问题。当上面的错误开始填充日志时,下面的Solr错误紧随其后10-15次,然后tomcat停止工作,我必须关闭并启动才能让它响应。

  

2012-04-25 21:46:00,527 [main] ERROR org.apache.catalina.loader.WebappClassLoader- Web应用程序[/ solr]创建了一个类型为[org.a]的密钥的ThreadLocal   pache.solr.schema.DateField.ThreadLocalDateFormat](value [org.apache.solr.schema.DateField$ThreadLocalDateFormat@1f1e90ac])和类型为[org.apache.solr的值]。   schema.DateField.ISO8601CanonicalDateFormat](value [org.apache.solr.schema.DateField$ISO8601CanonicalDateFormat@6b2ed43a])但是在网络时无法将其删除   应用程序停止了。这很可能会造成内存泄漏。

我的研究提出了很多关于更改管理线程的代码的建议,以确保它们能够扼杀数据库池连接等,但这段代码在近12个月内没有改变。 Solr应用程序崩溃了,这是第三方所以我的想法是这是环境(jar冲突,版本控制,配置脂肪指法?)

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

我刚注意到的一件事是我在Tomcat网络管理器中看到了数千个会话,但这可能是一个红色的鲱鱼。

如果有人看到这个,我们非常感谢任何帮助。

[编辑]

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

我首先从25-> 100上升MaxPoolSize并且我的应用程序在没有挂起的情况下运行了几天,然后从100-> 1000运行,并且从那以后(超过2周)它一直运行稳定。

这不是完整的解决方案,因为我需要找出它为什么用完池连接所以我还将c3p0的unreturnedConnectionTimeout设置为4小时,这对所有连接强制执行4小时的时间限制,无论它们是否处于活动状态。如果它是活动连接,它将关闭它并再次重新打开。

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

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

1 个答案:

答案 0 :(得分:2)

您声明事件的顺序是:

  • 出现错误
  • Tomcat停止响应
  • 需要重启

但是,仅在Web应用程序停止时才会报告内存泄漏错误消息。因此,某些事情会触发Web应用程序停止(或重新加载)。你需要弄清楚是什么触发它并停止它。

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

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

它看起来你的app和Solr都有一些需要修复的漏洞。演示文稿将为您提供一些指导。我还会考虑升级到最新的7.0.x.内存泄漏检测已得到改进,并非所有改进都已进入6.0.x.