問題タブ [weakhashmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
165 参照

java - WeakHashMap のようなキーとしてスレッドを持つ Java マップ?

ライブラリには、ThreadLocalいくつかのオブジェクトを持つ変数があります。これらすべてのオブジェクトを 1 つのデータ構造に蓄積し、必要に応じてそれらを反復できるようにしたいと考えています。一方で、アプリケーション シナリオに数千のスレッドの作成と終了が含まれる場合、このデータ構造が汚染されることは望ましくありません (さらに、これによりメモリ リークが発生する可能性があります)。そのため、ソリューションは、ローカルのオブジェクトからデッドスレッドまでのデータ構造を消去する必要があります。

解決策は、通常の抹消手順で が生きていないかどうかをさらにチェックする必要がある in キーWeakHashMapと似ているはずだと思います。以上の繰り返しが行われます。WeakReference<Thread>ThreadMap.values()

そのようなデータ構造の既存の実装はありますか? または、私の問題に対するより良い解決策がありますか?

0 投票する
1 に答える
519 参照

java - 弱い参照。WeakReferences だけが残っている場合、オブジェクトは削除されません。

システム内では、クライアントのセッションをクラス Session として提示します。

歴史的に、このクラスのハッシュコードは変更可能です。作成時には 0 であり、ある時点でユーザー ID に変更されます。

システムには 2 つのセッション マネージャーが存在します。

  1. クライアント セッション マネージャー - アクティブなクライアント セッションを保持するクライアントです。このマネージャーの内部は単純な ConcurrentHashMap< Long, Session > で、キーはユーザー ID です。
  2. メモリ セッション マネージャー - GC によってまだ収集されていないセッションを保持します。内部には WeakHashMap < Session, Long > があります (ここの値はユーザー ID です)

クライアントが接続してログインすると、次のフローが発生します。

  1. クライアント セッションが作成されます。
  2. メモリ セッション マネージャーに配置されたセッション (この時点でのハッシュコードは 0 であるため、単一のバケットに配置されます)
  3. クライアントがログインし、セッションが正しいハッシュ コードで Client Sessions Manager に入れられます。
  4. クライアント セッションが閉じられ、Client Sessions Manager から削除されます。

結果として、Session オブジェクトのすべての強い参照を収集した後、WeakHashMap から削除する必要があります。(WeakHashMap のエントリは、そのキーが通常使用されなくなったときに自動的に削除されます。より正確には、特定のキーのマッピングが存在しても、ガベージ コレクターによってキーが破棄される、つまりファイナライズ可能になるのを防ぐことはできません。 、ファイナライズされてから再利用されます。)しかし、何らかの理由でそれらはそこにとどまります。以下のコード:

単純化されたプログラム フローとセッション クラス (無駄な情報なし)。

多くの GC サイクルの後、メモリに残ります。これはGCのログです(G1、混合)

下の図では、問題のセッションのルートへのパスを確認でき、弱参照チェーンのみが存在することがわかります。

ここに画像の説明を入力

助けてください。または、少なくともいくつかの提案をしてください。

0 投票する
1 に答える
35 参照

java - WeakHashMap からの取得中のキャッシュの無効化

次のように、WeakHashMap を介してデータベース接続オブジェクトをキャッシュします。

出来ますか:

if ステートメントがチェックされ、キャッシュに既にオブジェクトが存在することがわかり、else ステートメントを実行する前にキャッシュが無効になりますか?

0 投票する
3 に答える
259 参照

java - 内部での WeakHashMap の仕組み

WeakHashMap のコードを調査して、より多くの知識を得るWeakReference

エントリが次のようになっていることがわかりました。

したがって、新しいエントリを作成するときは、 を呼び出しsuper(key, queue);ます。WeakReferenceコンストラクタです。オブジェクトがGCによって収集された後、私が理解している限り、新しい参照(上の参照であるべきだと思いますkey)がキューに表示されます。

また、各操作で呼び出すメソッドに気付きました:

(Entry<K,V>)キューから取得したよう です。これを説明する方法がわかりません(最初の質問)。このコード:

オブジェクトはすでにGCによって収集されているため、常にnullを出力します

また、私にとっては、GC によって既に収集されたオブジェクトを参照できることも奇妙でした。実際には、参照がキューに表示されるはずですが、オブジェクトが既に収集されているため、意味のあるものを読み取ることができませんでした ( 2 番目の質問)。