Clojure Web应用程序中的内存泄漏

时间:2011-03-17 05:55:06

标签: clojure amazon-ec2 tomcat6

我在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 ...来启动它们。

1 个答案:

答案 0 :(得分:1)

显然Tomcat有memory leak protection - 请查看链接。

我不认为它实际上是内存泄漏,Tomcat更有可能热衷于报告某些线程/ threadlocal未正确关闭/释放的事实。

警告令人讨厌,但这并不是一个致命的问题,因为一旦JVM关闭,所有线程本地内存都会被释放。

使用(future(loop ...))开始你的线程一般很好,但是你应该确保它们在正确的时刻实际退出。这可能意味着有一种“正在关闭?”你可以检查每个循环的原子。您可能会发现这会删除警告。