有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Tomcat 7.0.50中的java内存泄漏

我们目前正在使用ApacheTomcat7.0.50,它部署了多个web应用程序实例,我们正在尝试修复catalina中的一些错误。这看起来很严重。其中两项如下

  • 组织。阿帕奇。卡塔琳娜。加载器。WebappClassLoader checkThreadLocalMapForLeaks严重:web应用程序[/app_name]创建了一个ThreadLocal,其键类型为[class name](值[class name]),值类型为[classname](值)[classname@4b188d84])但在web应用程序停止时无法删除它。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏

  • 组织。阿帕奇。卡塔琳娜。加载器。WebappClassLoader clearReferencesJdbc严重:web应用程序[/app_name]注册了JDBC驱动程序[oracle.JDBC.driver.OracleDriver],但在web应用程序停止时未能注销它。为了防止内存泄漏,JDBC驱动程序已被强制注销

我们在不同的社区、博客和FAQ会议上确实看到了许多解决上述错误的方法,但我们正在努力寻找

  1. 为什么这些都是精确的

  2. 这些问题是否被认为是严重的,是否确实需要修复

  3. 我们如何通过一些ApacheTomcat配置来解决这些问题?我们在上下文中尝试了许多。xml,web。xml,服务器。xml等,但未能成功

  4. 在最坏的情况下,如果在任何情况下,这些都可以对catalina隐藏。出去,我们怎么做

请在这里帮助我们。任何帮助都将被感激和接受。提前谢谢

注意:对于iten 2,我已经找到了Oracle driver memory leak - Tomcat中提到的解决方案,但没有尝试过。这对Tomcat7.0.50真的有效吗

问候,, 山姆·莫汉


共 (1) 个答案

  1. # 1 楼答案

    这两个警告发生的原因大致相同。web应用程序外部的对象保留对应用程序内部对象的引用。这些是无法通过配置修复的代码级问题

    实际上,这个问题的严重程度实际上取决于1)您热取消部署/重新部署相关应用程序的频率,以及2)保留的应用程序的大部分。我通常会发现,在开发过程中,这个问题对我的影响更大,我经常热插拔应用程序,但在生产过程中就更少了,因为我倾向于在部署更新时重新启动tomcat。重新部署出现此问题的应用程序足够多次,JVM将因内存不足而崩溃

    此特定问题无法通过配置更改来解决,除非将编写服务器重启脚本视为配置解决方案。您需要进行代码更改,以断开指向web应用程序的对象引用。追踪它们可能相当棘手,但当警告突出显示时,首先要检查所有线程局部变量的使用情况。更完整的审查包括在卸载应用程序后获取tomcat的堆转储,然后使用堆分析器跟踪内存中对卸载的应用程序的引用(应该没有!)