Tomcat 7.0.50中的内存泄漏

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

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

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

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

  • 为什么这些发生的确切?

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

  • 我们如何通过一些Apache Tomcat配置来解决或解决这些问题?我们在context.xml,web.xml,server.xml等中尝试了很多,但是没有成功 .

  • 在最坏的情况下,如果在任何情况下这些都可以从catalina.out隐藏,我们怎么能这样做?

请帮助我们 . 任何帮助将被欣赏和接受 . 提前致谢 .

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

此致,Sam Mohan .

回答(1)

2 years ago

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

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

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