私はサーブレット内で多くのSimpleDateFormatオブジェクトを使用しています。残念ながら、SimpleDateFormatはスレッドセーフではありません。したがって、SimpleDateFormatオブジェクトの再利用を促進するためにThreadLocalでラップすることを考えました。私はこれを可能にするためにutil-classを書いた:サーブレット内のSimpleDateFormat
public class DateUtil {
private final static ThreadLocal<SimpleDateFormat> dateFormat = new ThreadLocal<SimpleDateFormat>() {
return new SimpleDateFormat();
}
public static SimpleDateFormat get() {
return dateFormat.get();
}
}
実際には、これはメモリリークにつながるようです。 []型のキーでThreadLocalの[ヌル](値[[email protected]]を作成したWebアプリケーション:
SEVERE:私のWebアプリケーションをシャットダウンすると、Tomcatは、次のエラーメッセージをログに記録します)と型[java.text.SimpleDateFormat](value [[email protected]])の値を返しますが、Webアプリケーションが停止したときにその値を削除できませんでした。これはメモリリークを引き起こす可能性が非常に高いです。
私はメモリリークの理由を理解していますが、サーブレット内でSimpleDateFormatオブジェクト(またはスレッドセーフではないオブジェクト)を処理する最良の方法は何ですか?
に私の答えを参照してくださいが、メモリリークの原因は何ですか?事前にありがとう。 – Victor
理由は、インスタンスSimpleDateFormatがこのコードを実行する各要求スレッドに対して保持されるため、そのインスタンスは削除されないことになります。 –