我在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
中答案 0 :(得分:2)
您声明事件的顺序是:
但是,仅在Web应用程序停止时才会报告内存泄漏错误消息。因此,某些事情会触发Web应用程序停止(或重新加载)。你需要弄清楚是什么触发它并停止它。
关于实际泄漏,您可能会发现这很有用:
http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf
它看起来你的app和Solr都有一些需要修复的漏洞。演示文稿将为您提供一些指导。我还会考虑升级到最新的7.0.x.内存泄漏检测已得到改进,并非所有改进都已进入6.0.x.