Java:有没有办法在取消部署我的应用程序之前删除所有ThreadLocals?

时间:2016-07-29 18:45:06

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

我收到此错误:

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。

1 个答案:

答案 0 :(得分:0)

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

实际上,如果这些工具足够好,如果我们默认在泽西岛启用了立即范围(见https://java.net/jira/browse/JERSEY-2979),那将会很酷。(见https://jersey.java.net/apidocs/latest/jersey/org/glassfish/jersey/server/spi/ContainerLifecycleListener.html)。 我想,我的想法是使用Jersey控制的执行程序服务来处理即时线程,这些线程会在Jersey应用程序生命周期的正确时刻关闭(例如,使用https://java.net/jira/browse/JERSEY-2979)。

如果您能够为此票证{{3}}做出贡献(至少通过添加示例),那将会很酷。