153

とは何ですかWeakHashMap、いつ使用する必要がありますか?WeakHashMapaとaの違いは何HashMapですか?

4

8 に答える 8

83

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

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

于 2011-04-01T09:12:04.033 に答える
51

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

Javaでの強参照と弱参照については、 「弱参照について」(Oracleのブログ記事)を読むことをお勧めします。違いを理解していなければ、データ構造自体はほとんど意味がありません。

于 2011-04-01T09:19:31.617 に答える
21

チェックアウトEffectiveJava、Edition 2、26ページ。

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

于 2013-07-01T13:58:08.477 に答える
11

jGuruから:

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

参考文献の詳細:

于 2011-04-01T09:13:34.520 に答える
8

弱参照は、到達可能性ガベージコレクター(GC)に作業を任せることに関するものです。弱参照が解決しようとしている問題を理解し、それが実際に動作していることを確認するのが最善だと思います。

  • 以下に関するIBMの記事

    Javaの理論と実践:弱い参照でメモリリークをプラグインします。グローバルマップでのメモリリーク、メモリリークの特定、レスキューへの弱参照、...

  • WeakHashMapをいつ使用するかについてのブログ記事(リンクの有効期限が切れています) :

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

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

于 2014-07-16T08:25:27.440 に答える
4

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

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

于 2012-01-13T09:36:35.263 に答える
2

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

于 2011-04-01T09:14:07.157 に答える
1

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

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

于 2016-01-05T00:16:56.723 に答える