1

私はオブジェクトを持っていますProducerいくつかのネットワークイベントをリッスンするスレッドを内部的に開始し、多くの場合はメソッドでブロックします。このProducerオブジェクトでは、私は、が、Producerが生成できるイベントであるキーと、これらのイベントに登録されているコンシューマのリストであるハッシュマップに含まれています。WeakHashMap <Integer、Vector <IConsumer>>は、IConsumersへの強い参照のみが含まれている場合は収集されますか?

今私はManagerを構成するMainオブジェクトを持っています。 Managerは、単一のProducerと任意の数のConcreteConsumers implements IConsumerを構成します。 Managerには、ProducerおよびConcreteConsumerへの参照が含まれています。

これは、有効な構造である実際のベクトルへの参照が存在しないようVector<IConsumer>WeakHashMap<Integer, Vector<IConsumer>>にすぐに挿入した後GCの対象にはなりませんか? ProducerおよびConcreteConsumerへの参照のみが直接存在します。もしそうなら、私はこれをどのように解決できますか?


次は何が起こるかMainオブジェクトはすべてConcreteConsumersは、私が欲しいものであるGC、対象にさせるべきでManagerへの参照を低下することがあります。

しかし、実際のProducerオブジェクトもGCに適格で、内部スレッドがこの時点で実行を停止したいと考えています。これを行う方法に関する提案はありますか?

+0

マップのキーと値の種類は何ですか? - WeakHashMapの*エントリ*は、* key *がもはや通常使用されていなくても自動的に削除されます。 " – JimmyB

+0

@ HannoBinder:ハッシュマップの実際のキーを書くのを忘れました。それは整数です。質問を更新しました。 –

答えて

2

弱い参照を持つWeakHashMapのキーです。値は強く参照されます。エントリは、キーへの強い参照がなくなってからしばらく削除されます。この場合はIntegerです。これは同じ値を持つインスタンスだけでなく、Integerのまったく同じインスタンスです。値の型は、WeakHashMapのキーとして特に有用ではありません。

WeakHashMapは(あなたがSoftReference Sを使用することにしたい、そしておそらく他の誰かのライブラリ)キャッシュとして有用ではありません。)

+2

"これは、同じ値を持つインスタンスだけでなく、Integerのインスタンスと同じです。 - JavaのIntegerオブジェクトの内部キャッシングが注目されるかもしれません。 – JimmyB

+0

お返事ありがとうございます。 'WeakHashMap'を完全に誤解してしまったようですが、私は何らかの理由でドキュメンテーションが弱い参照によって保持されている値であると誤解しています。私はマップ構造を 'Collections.newSetFromMap(WeakHashMap ...) 'によって構築された' HashMap > 'で置き換えました。 –

関連する問題