我在Clojure中创建了一个Web应用程序,将其打包为WAR,并将其部署在Tomcat之上。它按照我的预期工作,但是当我关闭Tomcat时,我会看到许多例外情况,如下所示:
SEVERE: The web application [] created a ThreadLocal with key of type
[java.lang.ThreadLocal] (value [java.lang.ThreadLocal@fc5408]) and a value of type [clojure.lang.LockingTransaction] (value [clojure.lang.LockingTransaction@12db7c]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
Mar 17, 2011 4:19:48 AM org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap
SEVERE: The web application [] created a ThreadLocal with key of type [null] (value [clojure.lang.Var$1@11de914]) and a value of type [clojure.lang.Var.Frame] (value [clojure.lang.Var$Frame@7c28c]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
Mar 17, 2011 4:19:48 AM org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap
SEVERE: The web application [] created a ThreadLocal with key of type [null] (value [clojure.lang.Var$1@11de914]) and a value of type [clojure.lang.Var.Frame] (value [clojure.lang.Var$Frame@17588d5]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
我知道clojure有些事情可能会有点像Java垃圾收集器。我的战争确实有一个ServletContextListener,可以启动一些后台线程,但是当上下文取消部署时,我认为没有理由不应该优雅地终止它们(毕竟它们不是守护线程)。
我是否应该使用更好/不同的方式来启动我更喜欢Tomcat的线程?现在我只是通过拨打(future (loop ...
来启动它们。
答案 0 :(得分:1)
显然Tomcat有memory leak protection - 请查看链接。
我不认为它实际上是内存泄漏,Tomcat更有可能热衷于报告某些线程/ threadlocal未正确关闭/释放的事实。
警告令人讨厌,但这并不是一个致命的问题,因为一旦JVM关闭,所有线程本地内存都会被释放。
使用(future(loop ...))开始你的线程一般很好,但是你应该确保它们在正确的时刻实际退出。这可能意味着有一种“正在关闭?”你可以检查每个循环的原子。您可能会发现这会删除警告。