とは何ですかWeakHashMap
、いつ使用する必要がありますか?WeakHashMap
aとaの違いは何HashMap
ですか?
8 に答える
弱いハッシュマップ内の要素は、キーオブジェクトへの他の強力な参照がない場合、ガベージコレクターによって再利用できます。これにより、それらはキャッシュ/ルックアップストレージに役立ちます。
弱参照はこれらのハッシュテーブルに制限されません。単一オブジェクトに弱参照を使用できます。これらはリソースを節約するのに役立ちます。何かへの参照を保持できますが、他に何も参照されていないときに収集できるようにします。(ところで、強い参照は通常のJava参照です)。ソフト参照ほど簡単には収集されない傾向がある弱い参照もあります(最後の強い参照が消えてから長い間ぶらぶらする傾向はありません)
他の人がすでに指摘しているように、弱参照は、オブジェクトへの強い参照を作成せずに、オブジェクトをキーとして使用するための手段を提供します。これは、オブジェクトをガベージコレクションするJVMの機能を損なうことなく、オブジェクトの一部の側面を追跡する機能を損なう必要がない場合に役立ちます。これにより、オブジェクトに関するメタデータをキャッシュまたは保存するための弱参照が理想的になります。 。
Javaでの強参照と弱参照については、 「弱参照について」(Oracleのブログ記事)を読むことをお勧めします。違いを理解していなければ、データ構造自体はほとんど意味がありません。
チェックアウトEffectiveJava、Edition 2、26ページ。
メモリリークのもう1つの一般的な原因は、キャッシュです。オブジェクト参照をキャッシュに入れると、そこにあることを忘れて、無関係になった後もずっとキャッシュに残しておくのは簡単です。この問題にはいくつかの解決策があります。幸運にも、キャッシュの外部にそのキーへの参照がある限り、エントリが正確に関連するキャッシュを実装できる場合は、キャッシュをWeakHashMapとして表します。エントリは、廃止されると自動的に削除されます。WeakHashMapが役立つのは、キャッシュエントリの望ましい存続期間が、値ではなくキーへの外部参照によって決定される場合のみであることに注意してください。
jGuruから:
WeakHashMapは、マップのキーがに格納される特別なMap実装
java.lang.ref.WeakReference
です。キーを弱参照に格納することにより、キーへの唯一の参照が弱参照からのものである場合に、キーと値のペアをマップから動的に削除できます。これにより、WeakHashMapは、他の場所で使用されていないエントリが副作用なしにドロップされる可能性がある、弱く参照されるリストの優れた実装になります。また、キーがドロップされる可能性があるからといって、すぐにドロップされるわけではありません。システムに十分なリソースがある場合、外部から参照されていない弱鍵参照が長期間存在する可能性があります。
参考文献の詳細:
弱参照は、到達可能性とガベージコレクター(GC)に作業を任せることに関するものです。弱参照が解決しようとしている問題を理解し、それが実際に動作していることを確認するのが最善だと思います。
以下に関するIBMの記事:
Javaの理論と実践:弱い参照でメモリリークをプラグインします。グローバルマップでのメモリリーク、メモリリークの特定、レスキューへの弱参照、...
WeakHashMapをいつ使用するかについてのブログ記事(リンクの有効期限が切れています) :
... WeakHashMapがキャッシュに適していない場合、それは何に適していますか?正規マップを実装するのは良いことです。強い参照があるオブジェクトにいくつかの追加情報を関連付けたいとします。オブジェクトをキーとして、追加情報をマップ値として、WeakHashMapにエントリを配置します。次に、オブジェクトへの強力な参照を保持している限り、マップをチェックして追加情報を取得できます。また、オブジェクトを解放すると、マップエントリがクリアされ、追加情報によって使用されていたメモリが解放されます。..。
java.lang.refに関するJavaドキュメント
人々はそれを使って「キャッシュメモリ」を実装します。アプリケーションで頻繁に再利用されるオブジェクトがあり、その構築に費用がかかり、オブジェクトが多すぎてすべてをメモリに保持できない場合は、WeakHashMapを使用します。
現在使用されていないオブジェクトをそこに置きます。このオブジェクトが必要な場合は、マップから取り出します。ほとんどの場合、これらのオブジェクトのほとんどはマップに残ります。秘訣は、それらが直接保持されるのではなく、WeakReferencesを介して保持されることです。したがって、それが本当に「混雑」した場合、メモリが不足しているときに、gcはそれらを収集することが許可されます。したがって、WeakHashMapからオブジェクトを取得しようとするたびに、オブジェクトがまだそこにあることを確認する必要があります。それ以外の場合は、再作成する必要があります。
WeakHashmapを使用すると、オブジェクトをキャッシュした結果としてメモリリークが発生する可能性を減らすことができます。キーへのすべての参照が削除されるたびに、WeakHashMapはエントリを自動的に削除します。
Weakhashmapを使用すると、完全なハッシュマップが使用されなくなるのを待つのではなく、エントリをガベージコレクションできます。そのため、キーが通常使用されなくなったときに、個々の値が自動的に削除されます。
これは、メモリリークを防ぐために使用できます。この場合、ユーザーデータなどのように、最大値が使用されていなくても、1つ以上のキーがまだ使用されているため、ハッシュマップが再利用されることはありません。