多个应用中的内存泄漏

Gre*_*edy 6 java mysql solr hibernate c3p0

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

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

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

2012-04-25 21:46:00,300 [main] ERROR 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]仍在处理尚未完成的请求.这很可能造成内存泄漏.您可以使用标准Conte xt实现的unloadDelay属性来控制请求完成所允许的时间.

在迁移期间,我们从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 pache.solr.schema.DateField]的密钥的ThreadLocal. ThreadLocalDateFormat](value [org.apache.solr.schema.DateField$ThreadLocalDateFormat@1f1e90ac])和类型为[org.apache.solr的值].schema.DateField.ISO8601CanonicalDateFormat](value [org.apache.solr.schema.DateField$ISO8601CanonicalDateFormat@6b2ed43a])但在Web应用程序停止时无法将其删除.这很可能造成内存泄漏.

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

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

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

如果有人看到这个任何帮助非常感谢.

[编辑]

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

我首先从25-> 100增加了MaxPoolSize,我的应用程序运行了几天没有挂起,然后从100-> 1000,从那以后(超过2周)它一直运行稳定.

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

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

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

Mar*_*mas 2

您声明事件的顺序是:

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

但是,只有当 Web 应用程序停止时才会报告内存泄漏错误消息。因此,某些东西正在触发 Web 应用程序停止(或重新加载)。您需要找出触发此事件的原因并阻止它。

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

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

看起来您的应用程序和 Solr 都存在一些需要修复的泄漏。该演示将为您提供一些指导。我还会考虑升级到最新的 7.0.x。内存泄漏检测已得到改进,但并非所有改进都已纳入 6.0.x。

  • 谢谢马克,我采纳了你的建议并转向了 TC7,但正如你正确指出的那样,我本末倒置,即问题看起来只是导致内存泄漏,但实际上是问题的结果,而不是其他方式大约。当我安装 TC7 时,它没有发现泄漏,因此我开始查看其他区域,结果发现是数据库连接池锁定导致了上述问题。 (2认同)