web-dev-qa-db-ja.com

WeakHashMapとは何ですか、またいつ使用するのですか?

WeakHashMapとは何ですか。いつ使用する必要がありますか? WeakHashMapHashMapの違いは何ですか?

142
developer

キーオブジェクトへの他の強力な参照がない場合、ガベージコレクターによって弱いハッシュマップの要素を回収できます。これにより、キャッシュ/ルックアップストレージに役立ちます。

弱参照はこれらのハッシュテーブルに限定されず、単一オブジェクトにWeakReferenceを使用できます。それらはリソースを節約するのに役立ちます。何かへの参照を保持できますが、他に何も参照していないときに収集できるようにします。 (ところで、強い参照は通常のJava参照です)。また、ソフト参照ほど簡単に収集されない傾向のある弱い参照もあります(最後の強い参照が消えてから長い間ハングアップする傾向はありません)

79
vickirk

他の人がすでに指摘したように、弱い参照は、オブジェクトへの強い参照を作成せずにキーとしてオブジェクトを使用する手段を提供します。これは、オブジェクトのガベージコレクションを行うJVMの機能を低下させたくないが、オブジェクトの何らかの側面を追跡する機能が必要な状況で役立ちます。これにより、オブジェクトに関するメタデータをキャッシュまたは保存するのに理想的な弱参照になります。

"Understanding Weak References" (Oracleブログ記事)、約strong vs. Javaの弱参照を読むことをお勧めします。違いを理解しないと、データ構造自体はほとんど意味がありません。

43
mmccomb

効果的なJava、エディション2、26ページ。

メモリリークのもう1つの一般的な原因はキャッシュです。オブジェクト参照をキャッシュに入れると、それがそこにあることを忘れて、無関係になってからずっとキャッシュに残しておくのは簡単です。この問題にはいくつかの解決策があります。キャッシュの外部にそのキーへの参照がある限り、エントリが正確に関連するキャッシュを実装するのに十分幸運であれば、キャッシュをWeakHashMap;として表します。エントリは陳腐化すると自動的に削除されます。 WeakHashMapは、キャッシュエントリの有効期間が値ではなくキーへの外部参照によって決定される場合にのみ有用であることを忘れないでください。

19
Hao Deng

jGur から:

WeakHashMapは、マップのキーがJava.lang.ref.WeakReferenceに格納される特別なMap実装です。キーを弱参照に格納することにより、キーへの唯一の参照が弱参照からである場合、キーと値のペアをマップから動的に削除できます。これにより、WeakHashMapは、弱参照リストの優れた実装になります。他の場所で使用されていないエントリは、副作用なしで削除できます。また、キーがドロップされる可能性があるからといって、それがすぐにドロップされるという意味ではありません。システムに十分なリソースがある場合、外部から参照されていない弱いキー参照は、長期間存在する可能性があります。

参照 の詳細:

11
Buhake Sindi

弱い参照はreachabilityであり、garbage collector(GC)あなたのための仕事。弱参照が解決しようとしている問題を理解し、実際にそれを見ることが最善だと思います。

  • IBM記事 について:

    Javaの理論と実践:弱い参照によるメモリリークのプラグイン。グローバルマップによるメモリリーク、メモリリークの特定、救助への弱い参照、...

  • A ブログ記事 WeakHashMapをいつ使用するかについて:

    ... WeakHashMapがキャッシュに適さない場合、それは何に適していますか?正規マップを実装するのは良いことです。強い参照を持つオブジェクトに追加情報を関連付けたいとしましょう。オブジェクトをキーとして、追加情報をマップ値として、WeakHashMapにエントリを配置します。その後、オブジェクトへの強力な参照を保持している限り、マップを確認して追加情報を取得できます。また、オブジェクトを解放すると、マップエントリがクリアされ、追加情報によって使用されていたメモリが解放されます。 ...

  • Java Java.lang.refに関するドキュメント

7

人々はそれを使用して「キャッシュメモリ」を実装します。アプリケーションで頻繁に再利用されるオブジェクトがいくつかあり、それらの構築に費用がかかり、それらのすべてがメモリ内に保持するには多すぎる場合--WeakHashMapを使用します。

現在使用されていないオブジェクトをそこに配置します。このオブジェクトが必要な場合-マップからそれを取得します。ほとんどの場合、これらのオブジェクトのほとんどはマップにとどまります。秘trickは、それらが直接保持されるのではなく、WeakReferencesを介して保持されることです。したがって、メモリが不足しているときに、本当に「混雑」している場合、gcはそれらを収集できます。そのため、WeakHashMapからオブジェクトを取得しようとするたびに、オブジェクトがまだそこにあることを確認する必要があります。それ以外の場合は、再作成する必要があります。

4
Chetan Sharma

WeakHashmapを使用すると、オブジェクトをキャッシュした結果としてメモリリークが発生する可能性を減らすことができます。 WeakHashMapは、キーへのすべての参照が削除されるたびに、エントリを自動的に削除します。

2
Gary Rowe

Weakhashmapを使用すると、完全なハッシュマップが使用されなくなるのを待たずに、エントリをガベージコレクションできます。そのため、キーが通常使用されなくなったときに、個々の値が自動的に削除されます。

ユーザーデータなどのように、最大​​値が使用されていない場合でも、1つ以上のキーが使用されているためハッシュマップが再利用されないメモリリークを防ぐために使用できます。

0
krmanish007