Servlet中的SimpleDateFormat

我在Servlet中使用了很多SimpleDateFormat对象。 不幸的是,SimpleDateFormat不是线程安全的。 因此,我考虑用ThreadLocal包装它以促进SimpleDateFormat对象的重用。 我写了一个util-class来启用它:

public class DateUtil { private final static ThreadLocal dateFormat = new ThreadLocal() { return new SimpleDateFormat(); } public static SimpleDateFormat get () { return dateFormat.get(); } } 

实际上,这似乎导致内存泄漏。 关闭我的webapp时,Tomcat会记录以下错误消息:

严重:Web应用程序[]使用[null]类型的键创建了一个ThreadLocal(值[com.example.util.DateUtil$2@50242f7d]),类型为[java.text.SimpleDateFormat](value [java.text] .SimpleDateFormat @ d91b489b])但在Web应用程序停止时无法将其删除。 这很可能造成内存泄漏。

我理解内存泄漏的原因,但是在Servlet中处理SimpleDateFormat-objects(或任何其他非线程安全对象)的最佳方法是什么?

除了使用替代实现( commons-lang或joda )之外,每次使用它时都只需创建一个SimpleDateFormat的新实例。

我意识到这会让你觉得很脏,需要洗澡,但它非常简单,不需要你做任何努力。 缺点是你将比以前更多的内存,但在大多数普通的Web应用程序中,你不太可能注意到JDBC的噪音。

请参阅我对ThreadLocal资源泄漏和WeakReference的回答

从commons-lang创建本地对象或使用FastDateFormat (FastDateFormat是SimpleDateFormat的快速且线程安全的版本。)。 joda-time是所有日期相关问题的常见答案;-)