2011-11-19 13 views
10

特別な操作が必要な複雑な静的フィールドを使用するjavaクラスがあるので、GCで安全にクリーニングできるようにclose()としてください。静的フィールドをアンロード

静的フィールドの初期化では、staticブロックを使用します。しかし、私はフィールドをGCでクリーンアップする前に、close()メソッドを呼び出すことができるように、静的フィールドを安全にアンロードする方法は今ではありません。

静的初期化ブロックと同様に、静的フィールドをアンロードする方法はありますか?

+1

finalize()の使用を検討しましたか? –

+2

私は持っています。しかし、私が知っていることから、クラスのオブジェクトは、そのクラスの静的フィールドではなく、ファイナライズします。だからファイナライズは私の選択肢ではありません。 –

+0

そのクラスのオブジェクトへのアクティブな参照の数を保持する静的フィールドを使用している可能性があります(コンストラクタでインクリメントされ、finalize()で減少)し、close()を呼び出すか、ファイナライズ時に "複雑な" )デクリメント後に0の参照カウントが発生します - 私はこれを試していない、しかし。 –

答えて

8

クラスがロードされているときにstaticブロックが初期化され、finalize()がオブジェクトに対してのみ機能するため、求めていることを行う方法はありません。

静的変数とその中の複雑な操作を、シングルトンクラスとそのインスタンスに置き換えることを検討してください。

このようにしてfinalize()メソッドを使用して、close()アクションを実行できます。

-2

静的クラスは(私の知る限りで)あなたが最初にそれを使用する場合、実行時にロードされ、プログラムが終了したときにのみアンロードされます。

静的メンバーcloseを静的メンバーをクリーンアップするクラス自体に作成し、終了時に呼び出すことができます。

+1

そして、それがWebアプリケーションの場合は、いつ終了するのか分かりますか? –

+0

いいえ、プログラムがまだ生きている間にクラスをアンロードできます。 – jtahlborn

1

これを達成するためにshutdown hookを設定できますが、すべての操作を完了できない場合があります。メモリが足りなくなっているか、プロセスがクリーンアップする機会を与えずに殺された可能性があります。

データの一貫性がこのコードに依存しないこと、または移動することをお勧めしますアプリケーションの存続期間中に定期的にクリーンアップするコードに変換します。

+0

Webアプリケーションのシャットダウンには 'ServletContextListener'が適しています。 http://stackoverflow.com/questions/6950396/contextdestroyed-vs-addshutdownhook –

+0

@ Kublaiを参照してください。私が同意するサーブレットコンテナのコンテキストでは、OPは質問のどこにでもWebアプリケーションのコンテキストを記述しません。 – rsp

+0

彼女はZom-Bの答えに対する彼女のコメントでそれを言いました。 –

2

ウェブアプリでは、​​を使用します。

+1

+1これは行く方法です、IMO。 ['contextDestroyed()'](http://download.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html#contextDestroyed(javax.servlet.ServletContextEvent))は、アンデプロイ時に1回だけ呼び出されます。必要に応じて['contextInitialized()'](http://download.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html#contextInitialized(javax.servlet。ServletContextEvent))は、特定のクラスがロードされるのを待つのではなく、展開時にこれらの静的フィールドを明示的に初期化するためにも使用できます。 –

3
private static Uninit cleanup = new Uninit(); 
.... 
private static class Uninit { 
    public Uninit() {} 

    public void finalize() { 

        //whatever you need done 

    } 
} 
+0

シングルトンの実装を避けたい場合は、これはちょっとしたトリックのようです。プライベートな匿名クラスを使用することもできます。これにはマイナス面がありますか? – Griddo

+0

これはファイナライザが実際に呼び出される場合にのみ機能します。 –

関連する問題