gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:10:42 25 4
gpt4 key购买 nike

我在 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 垃圾收集器领先一点。我的 war 确实有一个 ServletContextListener 启动一些后台线程,但我认为没有理由在上下文取消部署时不应该优雅地终止这些线程(毕竟它们不是守护线程)。

我应该使用更好/不同的方式来启动对 Tomcat 更友好的线程吗?现在我只是通过调用 (future (loop ... 来启动它们。 .

最佳答案

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

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

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

用 (future (loop ...)) 开始你的线程通常很好,但你应该确保它们在正确的时刻真正退出。这可能意味着有类似“正在关闭?”的东西。您可以在每个循环上检查的原子。您可能会发现这会删除警告。

关于clojure - Clojure Web 应用程序中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5335411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com