【发布时间】:2014-11-22 09:25:51
【问题描述】:
我为此使用了谷歌,查看了多个建议,但似乎没有任何帮助。
我有一个使用 MDC 的 JAX-RS 应用程序,当一个端点被命中时会设置一个 transactionId 以便于调试。但是,当我停止或重新启动 Tomcat 时,日志中会充满这样的条目:
27-Sep-2014 09:42:14.858 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks Web 应用程序 [/core-1.0.0-RC2] 创建了一个带有密钥的 ThreadLocal [org.apache.log4j.helpers.ThreadLocalMap] 类型的(值 [org.apache.log4j.helpers.ThreadLocalMap@464437fc])和 [java.util.Hashtable] 类型的值(值 [{siteCode=000tst, transactionId =dc8f3a1b-1d7a-4f91-abf6-58d015632d03}])但在 Web 应用程序停止时未能将其删除。线程将随着时间的推移而更新,以避免可能的内存泄漏。
我有一个调用 MDC 的 RequestFilter:
import org.slf4j.MDC;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import java.io.IOException;
import java.util.UUID;
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
String siteCodeHeader = containerRequestContext.getHeaderString("Site-Code");
if (siteCodeHeader != null) {
MDC.put("siteCode", siteCodeHeader);
} else {
MDC.put("siteCode", "NULL");
}
MDC.put("transactionId", UUID.randomUUID().toString());
}
这些是我的 sl4fj 依赖项:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
如果我有一个带有 MDC.clear() 的 ResponseFilter 它会从 MDC 中删除值,但似乎没有清除线程:
27-Sep-2014 09:12:58.216 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks Web 应用程序 [/core-1.0.0-RC2] 创建了一个带有密钥的 ThreadLocal [org.apache.log4j.helpers.ThreadLocalMap] 类型(值 [org.apache.log4j.helpers.ThreadLocalMap@391216c7])和 [java.util.Hashtable] 类型值(值 [{}])但失败在 Web 应用程序停止时将其删除。线程将随着时间的推移而更新,以避免可能的内存泄漏。
显然它已在 log4j 1.2.17 中修复,但更改似乎没有过滤到 slf4j。
【问题讨论】:
标签: java tomcat memory-leaks slf4j mdc