3

サーブレット内で多くの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オブジェクト(またはその他のスレッドセーフでないオブジェクト)を処理するための最良の方法は何ですか?

4

2 に答える 2

5

代替の実装(commons-langまたはjoda)を使用する以外に、使用するたびに新しいインスタンスを作成するだけSimpleDateFormatです。

汚れて風呂が必要になると思いますが、とてもシンプルで手間がかかりません。欠点は、以前よりも少し多くのメモリを使用することですが、ほとんどの通常のWebアプリケーションでは、JDBCのノイズに気付くことはほとんどありません。

ThreadLocalResourceLeakとWeakReferenceに対する私の回答を参照してください

于 2011-01-10T22:25:49.947 に答える
3

commons-langからローカルオブジェクトを作成するか、FastDateFormat(FastDateFormatはSimpleDateFormatの高速でスレッドセーフなバージョンです)を使用します。そして、joda-timeは、日付に関連するすべての質問に対する一般的な回答です;-)

于 2011-01-10T22:05:54.720 に答える