サーブレット内で多くのSimpleDateFormatオブジェクトを使用しています。残念ながら、SimpleDateFormatはスレッドセーフではありません。したがって、SimpleDateFormat-objectsの再利用を促進するために、それをThreadLocalでラップすることを考えました。これを有効にするためにutil-classを作成しました。
public class DateUtil {
private final static ThreadLocal<SimpleDateFormat> dateFormat = new ThreadLocal<SimpleDateFormat>() {
return new SimpleDateFormat();
}
public static SimpleDateFormat get () {
return dateFormat.get();
}
}
実際、これはメモリリークにつながるようです。Webアプリケーションをシャットダウンすると、Tomcatは次のエラーメッセージをログに記録します。
重大:Webアプリケーション[]は、タイプ[null](値[com.example.util.DateUtil$2@50242f7d])のキーとタイプ[java.text.SimpleDateFormat](値[java.text])の値でThreadLocalを作成しました.SimpleDateFormat @ d91b489b])が、Webアプリケーションが停止したときに削除できませんでした。これにより、メモリリークが発生する可能性が非常に高くなります。
メモリリークの理由は理解していますが、サーブレット内でSimpleDateFormatオブジェクト(またはその他のスレッドセーフでないオブジェクト)を処理するための最良の方法は何ですか?