gpt4 book ai didi

java - 使用 ThreadLocal 的库可能导致 Tomcat 中的内存泄漏

转载 作者:行者123 更新时间:2023-11-28 22:11:53 25 4
gpt4 key购买 nike

我使用的是 Box.com Java SDK,该库执行以下 ThreadLocal:

private static final ThreadLocal<DateFormat> THREAD_LOCAL_DATE_FORMAT =
new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
}
};

但是,我相信这是我的 tomcat 连接池问题的原因。特别是因为据报道后续泄漏会影响 HibernatePersistenceContextInterceptor。

SEVERE: The web application [] created a ThreadLocal with key of type [com.box.sdk.BoxDateFormat$1] (value [com.box.sdk.BoxDateFormat$1@275ab696]) and a value of type [java.text.Simple DateFormat] (value [java.text.SimpleDateFormat@faabb360]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a pro bable memory leak.

在不重写库的大部分内容的情况下,我有办法处理这种情况吗?

最佳答案

该消息告诉您 Tomcat 将替换线程以清除这些孤立的 ThreadLocal 值。因此,虽然不能保证可以避免问题,但 Tomcat 正在尝试减轻该错误的影响。

一般来说,这可能是个问题,因为当弱引用的 ThreadLocal 实例被垃圾回收时,线程映射中的条目会保留一段时间,从而阻止值、它的类和它的类加载器不被垃圾收集。但是,由于本例中的值 (DateFormat) 来自 Bootstrap 加载程序,因此它无论如何都不会被卸载,也不应该成为问题。

要在应用程序关闭时清除这些孤儿,您必须通过反射深入了解 Thread 的内部结构。听起来很乱!

我会首先寻找更有力的证据来将您的连接池问题归咎于此。比如你的连接池有没有被Tomcat替换请求线程暴露出来的bug?也许那个错误更容易自己修复。

关于java - 使用 ThreadLocal 的库可能导致 Tomcat 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32359525/

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