【问题标题】:Java: Is there a way where I can remove all ThreadLocals before undeploying my application?Java:有没有办法在取消部署我的应用程序之前删除所有 ThreadLocals?
【发布时间】:2016-12-04 13:44:45
【问题描述】:

我收到此错误:

SEVERE: The web application [/app] appears to have started a thread named [ImmediateThread-1469817702874] but has failed to stop it. This is very likely to create a memory leak.

我为此使用 Jersey,我相信它会创建 ImmediateThread,基本上,我无法控制它。有什么方法可以让我访问所有ThreadLocal 对象并在contextDestroyed() 上删除它们?

我知道,如果我们只是重新启动 Tomcat 服务器,这可以忽略不计,但我希望有权取消部署和部署应用程序,而不必担心可能的内存泄漏。

我正在使用 Java 7、Tomcat 7、Jersey、Hibernate。

【问题讨论】:

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


【解决方案1】:

如果您使用了足够新的 HK2,您应该能够拥有控制即时线程的工具,正如 John Wells 所建议的(请参阅 https://java.net/jira/browse/HK2-280?focusedCommentId=390557&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-390557)。

实际上,如果工具足够好,如果我们在 Jersey 中按预期默认启用即时作用域,那就太棒了(请参阅https://java.net/jira/browse/JERSEY-2979)。
我想,这个想法是使用 Jersey 控制的执行器服务来处理在 Jersey 应用程序生命周期的正确时刻关闭的即时线程(例如,通过使用 https://jersey.java.net/apidocs/latest/jersey/org/glassfish/jersey/server/spi/ContainerLifecycleListener.html)。

如果您能够为这张票 https://java.net/jira/browse/JERSEY-2979 做出贡献,那就太棒了(至少通过添加一个示例)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多