Tomcat 7.0.50中的内存泄漏

时间:2015-06-01 13:52:36

标签: java oracle tomcat memory-leaks tomcat7

我们目前正在使用部署了多个Web应用程序实例的Apache Tomcat 7.0.50,并且我们正在尝试修复catalina.out中的一些看似严重的错误。其中两个如下。

  • org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks SEVERE:Web应用程序[/ app_name]创建了一个ThreadLocal,其键类型为[class name](value [class name]),类型为[classname] ](值[classname @ 4b188d84])但在Web应用程序停止时无法将其删除。线程将随着时间的推移而更新,以避免可能的内存泄漏。

  • org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc SEVERE:Web应用程序[/ app_name]注册了JDBC驱动程序[oracle.jdbc.driver.OracleDriver],但在Web应用程序停止时无法取消注册。为防止内存泄漏,JDBC驱动程序已被强制取消注册。

我们已经在各种社区,博客和常见问题解答会议中看到了上述这些错误的许多解决方案,但正在努力寻找

  1. 为什么这些事情发生的确切?

  2. 这些被认为是严重的,需要确定吗?

  3. 我们如何使用某些Apache Tomcat配置解决或解决这些问题?我们在context.xml,web.xml,server.xml等中尝试了很多,但是没有成功。

  4. 在最坏的情况下,如果在任何情况下这些都可以从catalina.out中隐藏,我们该怎么办呢?

  5. 请在这里帮助我们。任何帮助将被欣赏和接受。提前谢谢。

    注意:对于2,我找到了Oracle driver memory leak - Tomcat中提到的解决方案,但没试过。这真的适用于Tomcat 7.0.50吗?

    此致 Sam Mohan。

1 个答案:

答案 0 :(得分:1)

出于同样的原因,这两种警告都发生了。 Web应用程序外部的对象保持对应用程序内对象的引用。这些是无法通过配置修复的代码级问题。

在实践中,这有多大问题实际上取决于1)您热取消部署/重新部署相关应用程序的频率以及2)应用程序的大部分内容是什么。我通常会发现这个问题在开发中给我带来了很多,我热交换应用程序很多,但在生产中却少得多,因为我倾向于重新启动tomcat作为部署更新。使用此问题重新部署应用程序足够多次,JVM将因内存不足而崩溃。

除非您将服务器重新启动的脚本计为配置解决方案,否则无法从配置更改中解决此特定问题。您需要更改代码以中断指向Web应用程序的对象引用。追踪它们可能相当棘手,但警告重点从审查所有线程本地的使用开始。更完整的回顾包括在卸载应用程序之后获取tomcat的堆转储,然后使用堆分析器在内存中跟踪对已卸载的应用程序的引用(应该没有!)。