我正在使用一个简单的基于 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