繁体   English   中英

多个应用中的内存泄漏

[英]Memory Leak in multiple apps

我在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中

您声明事件的顺序是:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM