【问题标题】:ThreadLocal memory leak in GlassfishGlassfish 中的 ThreadLocal 内存泄漏
【发布时间】:2011-12-16 11:57:41
【问题描述】:

ThreadLocal 是否会像在 Tomcat 中一样导致 Glassfish 服务器中的内存泄漏?为什么? http://wiki.apache.org/tomcat/MemoryLeakProtection

【问题讨论】:

  • Ummm ...您链接到的页面表明该问题已在 Tomcat 7.0.6 中修复。这对你来说还不够好吗?
  • @Stephen 对于静态类变量,它不会被检测到,并且默认情况下修复是关闭的。而且,我问这个问题主要是为了了解为什么?不是为了选择要使用的服务器。无论如何,感谢您的评论。
  • 1) 您没有询问静态变量 - 您询问的是 ThreadLocal 泄漏。 2) 您可以轻松开启非默认修复。

标签: java tomcat memory-leaks glassfish thread-local


【解决方案1】:

是的,它会泄漏,根据这个相对较新的 Glassfish JIRA 问题,Glassfish 甚至不会警告您:

http://java.net/jira/browse/GLASSFISH-14128

但是需要说明的是,ThreadLocal 特定的泄漏本身并不是应用程序/Web 服务器中的“错误”,而是在这些容器中运行的组件中的代码问题(无论这些组件是 servlet、会话 bean 还是随便)。

一般来说,应用服务器/Web 容器尝试做的是保护开发人员免于编写大量维护代码,并使他专注于业务逻辑。然而,他需要对应用程序服务器的工作方式(线程池、类加载器、部署/取消部署机制,...)有所了解,以便正确完成或避免此类 ThreadLocal 问题。这并不总是那么容易,而且可能非常棘手。我记得在 Glassfish 中阅读过有关内存泄漏问题的信息?与使用自定义日志级别有关。

Apache Tomcat 所做的是它有一个辅助机制来警告用户/处理用户代码中一些常见的内存泄漏问题。但即使在问题中提供的链接中,您也可能会看到并非所有可能的 ThreadLocal 内存泄漏都是使用此机制自动完成的。

Glassfish 似乎还没有这个附加功能。

【讨论】:

【解决方案2】:

这个问题会导致各种各样的问题。我前段时间发过帖子

I need help finding my memory leak using MAT

我们自己手动释放对象。我想我在 GF 错误列表中看到这已在 3.1x 版本中得到修复。

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 2013-07-31
    • 1970-01-01
    • 2015-12-28
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2022-06-10
    相关资源
    最近更新 更多