問題タブ [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.
java - WeakHashMap のようなキーとしてスレッドを持つ Java マップ?
ライブラリには、ThreadLocal
いくつかのオブジェクトを持つ変数があります。これらすべてのオブジェクトを 1 つのデータ構造に蓄積し、必要に応じてそれらを反復できるようにしたいと考えています。一方で、アプリケーション シナリオに数千のスレッドの作成と終了が含まれる場合、このデータ構造が汚染されることは望ましくありません (さらに、これによりメモリ リークが発生する可能性があります)。そのため、ソリューションは、ローカルのオブジェクトからデッドスレッドまでのデータ構造を消去する必要があります。
解決策は、通常の抹消手順で が生きていないかどうかをさらにチェックする必要がある in キーWeakHashMap
と似ているはずだと思います。以上の繰り返しが行われます。WeakReference<Thread>
Thread
Map.values()
そのようなデータ構造の既存の実装はありますか? または、私の問題に対するより良い解決策がありますか?
java - 弱い参照。WeakReferences だけが残っている場合、オブジェクトは削除されません。
システム内では、クライアントのセッションをクラス Session として提示します。
歴史的に、このクラスのハッシュコードは変更可能です。作成時には 0 であり、ある時点でユーザー ID に変更されます。
システムには 2 つのセッション マネージャーが存在します。
- クライアント セッション マネージャー - アクティブなクライアント セッションを保持するクライアントです。このマネージャーの内部は単純な ConcurrentHashMap< Long, Session > で、キーはユーザー ID です。
- メモリ セッション マネージャー - GC によってまだ収集されていないセッションを保持します。内部には WeakHashMap < Session, Long > があります (ここの値はユーザー ID です)
クライアントが接続してログインすると、次のフローが発生します。
- クライアント セッションが作成されます。
- メモリ セッション マネージャーに配置されたセッション (この時点でのハッシュコードは 0 であるため、単一のバケットに配置されます)
- クライアントがログインし、セッションが正しいハッシュ コードで Client Sessions Manager に入れられます。
- クライアント セッションが閉じられ、Client Sessions Manager から削除されます。
結果として、Session オブジェクトのすべての強い参照を収集した後、WeakHashMap から削除する必要があります。(WeakHashMap のエントリは、そのキーが通常使用されなくなったときに自動的に削除されます。より正確には、特定のキーのマッピングが存在しても、ガベージ コレクターによってキーが破棄される、つまりファイナライズ可能になるのを防ぐことはできません。 、ファイナライズされてから再利用されます。)しかし、何らかの理由でそれらはそこにとどまります。以下のコード:
単純化されたプログラム フローとセッション クラス (無駄な情報なし)。
多くの GC サイクルの後、メモリに残ります。これはGCのログです(G1、混合)
下の図では、問題のセッションのルートへのパスを確認でき、弱参照チェーンのみが存在することがわかります。
助けてください。または、少なくともいくつかの提案をしてください。
java - WeakHashMap からの取得中のキャッシュの無効化
次のように、WeakHashMap を介してデータベース接続オブジェクトをキャッシュします。
出来ますか:
if ステートメントがチェックされ、キャッシュに既にオブジェクトが存在することがわかり、else ステートメントを実行する前にキャッシュが無効になりますか?
java - 内部での WeakHashMap の仕組み
WeakHashMap のコードを調査して、より多くの知識を得るWeakReference
エントリが次のようになっていることがわかりました。
したがって、新しいエントリを作成するときは、 を呼び出しsuper(key, queue);
ます。WeakReference
コンストラクタです。オブジェクトがGCによって収集された後、私が理解している限り、新しい参照(上の参照であるべきだと思いますkey
)がキューに表示されます。
また、各操作で呼び出すメソッドに気付きました:
(Entry<K,V>)
キューから取得したよう です。これを説明する方法がわかりません(最初の質問)。このコード:
オブジェクトはすでにGCによって収集されているため、常にnullを出力します
また、私にとっては、GC によって既に収集されたオブジェクトを参照できることも奇妙でした。実際には、参照がキューに表示されるはずですが、オブジェクトが既に収集されているため、意味のあるものを読み取ることができませんでした ( 2 番目の質問)。