3

我正在使用一个简单的基于 Spray 的 servlet。在 Tomcat7 上部署和运行这个 servlet 之后,我取消部署它(之后可能再次部署它),而不重新启动 servlet 容器(因此基本上保留了 JVM 实例)。

问题是 Akka 在每次 servlet 部署时创建的线程在servled 被取消部署时(即 Akka 关闭时)并没有被破坏,并且在每次部署时都会创建一组线程。因此……泄漏

打电话system.shutdown()system.awaitTermination()没用。

有没有办法杀死在 servlet 初始化时产生的这些线程?

这是来自 Tomcat7 的示例日志条目:

SEVERE: The web application [/...] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@68871741]) and a value of type [scala.concurrent.forkjoin.ForkJoinPool.Submitter] (value [scala.concurrent.forkjoin.ForkJoinPool$Submitter@155aa3ef]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak. Nov 14, 2013 1:53:24 PM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks

4

1 回答 1

1

您是否尝试过在 ServletContextListener#contextDestroyed() 调用 system.shutdown() 和 system.awaitTermination()?在继续取消部署应用程序之前,这应该清除所有资源。

如果您使用的是 Scala API,我为此创建了一个 PR:https ://github.com/spray/spray/pull/787

干杯

图里奥

于 2014-02-26T15:17:21.703 回答