首页 文章

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

提问于
浏览
1

我正在使用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:Web应用程序[]创建了一个ThreadLocal,其键为[com.box.sdk.BoxDateFormat $ 1](值为[com.box.sdk.BoxDateFormat$1@275ab696]),值为[java.text . 简单的DateFormat](值[java.text.SimpleDateFormat@faabb360])但在Web应用程序停止时无法将其删除 . 线程将随着时间的推移而更新,以尝试避免可能的内存泄漏 .

如果不重写大部分库,我有办法处理这种情况吗?

1 回答

  • 2

    该消息告诉您Tomcat将替换线程以清除这些孤立的 ThreadLocal 值 . 因此,虽然不能保证防止出现问题,但Tomcat正试图减轻bug的影响 .

    通常,这可能是一个问题,因为当弱引用的 ThreadLocal 实例被垃圾收集时,线程映射中的条目可以保留一段时间,从而防止值,它的类和它的类加载器被垃圾收集 . 但是,由于此情况下的值( DateFormat )来自引导加载程序,因此它不会成为问题 .

    要在应用程序关闭时清除这些孤立,您必须使用反射挖掘 Thread 的内部 . 听起来很乱!

    我首先会寻找更有力的证据来归咎于你的连接池问题 . 例如,您的连接池中是否存在由Tomcat替换请求线程而暴露的错误?也许这个bug更容易修复自己 .

相关问题