我对ThreadLocal的有限理解是它存在资源泄漏问题。我认为可以通过在ThreadLocal中适当地使用WeakReferences来解决此问题(尽管我可能会误解了这一点。)我只想提供一个模式或示例,以将ThreadLocal与WeakReference一起正确使用(如果存在)。例如,在此代码段中,将引入WeakReference吗?
static class DateTimeFormatter {
private static final ThreadLocal<SimpleDateFormat> DATE_PARSER_THREAD_LOCAL = new ThreadLocal<SimpleDateFormat>() {
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy/MM/dd HH:mmz");
}
};
public String format(final Date date) {
return DATE_PARSER_THREAD_LOCAL.get().format(date);
}
public Date parse(final String date) throws ParseException
{
return DATE_PARSER_THREAD_LOCAL.get().parse(date);
}
}
ThreadLocal
在WeakReference
内部使用。如果ThreadLocal
未强烈引用,则即使各种线程都通过that存储值,也将对其进行垃圾回收ThreadLocal
。
此外,ThreadLocal
值实际上存储在Thread
;中。如果线程死亡,则将通过a ThreadLocal
收集与该线程关联的所有值。
如果您有ThreadLocal
最终班级成员的身份,那将是一个很好的参考,并且只有在卸载该类后才能收集它。但这是任何类成员的工作方式,不被视为内存泄漏。
更新: 只有在ThreadLocal
强引用中存储的值ThreadLocal
(某种循环引用)中,所引用的问题才起作用。
在这种情况下,值(a SimpleDateFormat
)没有向后引用ThreadLocal
。这段代码没有内存泄漏。
问题内容: 在多个帖子中都提到了这一点:不当使用会导致内存泄漏。我正在努力了解使用内存泄漏将如何发生。 我发现的唯一情况如下: Web服务器维护一个线程池(例如,用于servlet)。如果未删除其中的变量,则这些线程可能会导致内存泄漏,因为线程不会死亡。 这种情况下没有提到“ Perm Space”内存泄漏。那是内存泄漏的唯一(主要)用例吗? 问题答案: PermGen的exhaustions 与
Eclipse Java警告:资源泄漏:“Unassigned Closeable Value”从不关闭 漏在哪里?
大家晚上好。我是一个使用Java编程的完全初学者,我正在学习“扫描仪”,但是当我在Eclipse中键入这个基本代码时,我收到一条消息说“资源泄漏:‘扫描仪’永远不会关闭。 我做错了什么?
我试图理解不对任何流调用close()会如何影响系统的性能和功能。为了做到这一点,我创建了下面的测试类。
我是个新手。我已经编写了这段代码,它显示那里存在资源泄漏 这是什么意思?抱歉,我太天真了。
Eclipse显示警告消息,表示"资源泄漏,准备好的语句未在以下位置关闭" 在我看来,finally块负责关闭preparedstatement和rs对象。你知道为什么eclipse还在抱怨资源泄漏吗?