内部マップで独自のインスタンスを追跡するガベージコレクションオブジェクト

StackOverflow https://stackoverflow.com/questions/346762

質問

クラスのコンストラクターで、現在のオブジェクト( this )とそのキー(コンストラクターでパラメーターとして入力された文字列)を静的なLinkedHashMapにマップして、後で必要になるかもしれない文字列でオブジェクトを指定します。

コードは次のとおりです(役立つ場合):

public class DataEntry {
    /** Internal global list of DataEntry objects. */
    private static LinkedHashMap _INTERNAL_LIST;

    /** The data entry's name. */
    private String NAME;

    /** The value this data entry represents. */
    private Object VALUE;


    /** Defines a DataEntry object with a name and a value. */
    public DataEntry( String name, Object value )
    {
        if( _INTERNAL_LIST == null )
        {
            _INTERNAL_LIST = new LinkedHashMap();
        }

        _INTERNAL_LIST.put( name, this );

        NAME = name;
        VALUE = value;
    }
}

問題は?このクラスのインスタンスは、使い終わってもガベージコレクションされません。

Remove()メソッドなどを毎回手動で呼び出さずに(内部の参照を削除するために)使用せずに、このクラスのインスタンスをクリーンアップする方法があるかどうかに興味がありますLinkedHashMapを使用しなくなったとき、つまり)。

役に立ちましたか?

解決

コンストラクタが完了する前にオブジェクトを他の人に見えるようにすることはスレッドセーフではありません。

この場合のマップの使用方法は明確ではありませんが、クラスに次のような静的メソッドがあると仮定します。

public static DataEntry getEntry(String name) {
  return _INTERNAL_LIST.get(name);
}

同時に実行されている別のスレッドは、作成中にDataEntryにアクセスし、初期化されていないVALUEを持つエントリの使用を開始できます。新しいインスタンスをマップに追加することが最後になるようにコンストラクタ内のコードを並べ替えても、JVMは命令を並べ替えて、オブジェクトが最初にリストに追加されるようにします。または、クラスが拡張されている場合、オブジェクトが公開された後にサブクラスの初期化が行われる可能性があります。

複数のスレッドがWeakReferenceクラスとの対話にアクセスすると、プラットフォームに依存し、断続的で、診断が非常に困難な同時実行バグが発生する可能性があります。

記事 <!> quot;安全な構築、 Brian Goetzによる<!> quot; には、このトピックに関する詳細が記載されています。

元の質問に戻る:他の人が述べたようにReferenceQueueを使用するのは良いアプローチですが、マップ内のすべてのエントリを反復処理するのではなく、値のラッパーを作成してremove (それはあなたのLinkedHashMap自身、またはヘルパーかもしれません)、そして java.util.concurrent 。これにより、収集されたエントリのキューをすばやくポーリングし、マップから削除できます。これは、バックグラウンドスレッド( Collections.synchronizedMap() )クラス初期化子で開始された、または古いエントリをクリーンアップできました(ポーリング)新しいエントリが追加されるたび。

プログラムがマルチスレッドの場合、を放棄する必要があります。 ConcurrentMap.html "rel =" nofollow noreferrer "> <=> 、または<=>を <=>

他のヒント

値を WeakReferences (または SoftReferences ) 。そうすれば、値をガベージコレクションできます。もちろん、マップにはまだエントリがありますが、Weak / SoftReferenceが空になっているエントリのマップを定期的にクリアできます。

使用したいものは弱い参照のようです。概念は、弱参照はオブジェクトをGCしないように強制するほど強力ではないということです。私はそれらの経験はあまりありませんが、詳細についてはをご覧ください。ここ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top