2011-01-10 13 views
2

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

+0

に私の答えを参照してくださいが、メモリリークの原因は何ですか?事前にありがとう。 – Victor

+0

理由は、インスタンスSimpleDateFormatがこのコードを実行する各要求スレッドに対して保持されるため、そのインスタンスは削除されないことになります。 –

答えて

5

はちょうどあなたが何をそれを使用するたびにSimpleDateFormatの新しいインスタンスを作成するために、一般的な答えです。

これはあなたが汚い気分になり、風呂が必要になることを理解していますが、それは非常に簡単で、あなたの側では何の努力も必要としません。欠点は、これまで以上に少しメモリを引き渡すことですが、ほとんどの通常のWebアプリケーションでは、JDBCのノイズに気付くことはまずありません。

は私がのCommNetで質問をすることになって一つないです理解ThreadLocal Resource Leak and WeakReference

+3

+1複雑なことをしないためには、 – keuleJ

+1

です。「SimpleDateFormat」は高価です(内部的に 'Calendar'インスタンスを作成します)。参照してください:http://stackoverflow.com/questions/4107839/synchronizing-access-to-simpledateformat – Joe23

+3

http://www.thedwick.com/blog/2008/04/simpledateformat -performance-pig/jdbc/hibernateクエリを実行した後でhtmlページに20の日付を置いているのであれば、それほど重要ではないでしょう。あなたのプログラムが正しいことを確認*最初*その後、それを速くする。 –

3

ローカルオブジェクトを作成するか、FastDateFormat(FastDateFormatはSimpleDateFormatの高速でスレッドセーフなバージョンです)をcommons-langから使用します。そしてジョダ-時間は、全ての日付関連の質問;-)別に代替実装(commons-langまたはjoda)を使用してから

関連する問題