問題タブ [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 - Javaのメモリ内キャッシュオブジェクト
オブジェクトをメモリにキャッシュしたい。要件は次のとおりです。
- すべてのレコード/オブジェクトは一意のキーに関連付けられています。
- 保存する400〜500のレコード/オブジェクト。レコード数が指定された制限を超えて増加した場合は、古いレコードを削除する必要があります。
- レコードは2分を超えて保存しないでください。
- JVMがメモリを使い果たしているときにスケールダウンする必要があります(弱参照の一種)。
- サードパーティのライブラリはモジュールが小さく、不要なネットワークアクセスを減らすことを目的としているため、使用できません。
- 書き込みが多く、読み取りが少ない
機密データをキャッシュするため、セキュリティもここで懸念されます。このデータはメモリにキャッシュされます。本当にセキュリティを心配してデータを暗号化する必要がありますか?
同様の機能を提供するJavaクラスを探しています。
WeakHashMap
現在、要件に準拠するために、さまざまなプライベート/パブリックメソッドを拡張および実装することを考えています。
他にアイデアがあれば、ここで共有してください。
java - Java:なぜWeakHashMapはMapを実装しているのに、AbstractMapによってすでに実装されているのですか?
重複の可能性:
Java.util.HashMap — HashMap が AbstractMap を拡張して Map を実装するのはなぜですか?
親クラスと子クラスの両方が同じインターフェースを実装するのはなぜですか?
WeakHashMap<K,V>は、 AbstractMap<K,V>を拡張し、 Map<K, V>を実装するために宣言されています。
しかし、AbstractMap<K,V> はすでにMap<K,V>を実装しています。implements
宣言が冗長なようです。
宣言された理由は何ですか?
java - WeakHashMap ランダムにクリア
私はゲームを実行しています。起動時に画像を画像の中にロードしますWeakHashMap
。ゲームを実行すると、RAM が増加し続け、最終的にはWeakHashMap
すべてのデータをアンロードします。これはガベージ コレクションに関連していますか? 解決策はありますか?
java - WeakHashMap で同じキーを再作成します
weakhashmapのJavaドキュメントによると:
「このクラスは主に、equals メソッドが == 演算子を使用してオブジェクトの同一性をテストするキー オブジェクトで使用することを目的としています。一度そのようなキーが破棄されると、二度と再作成できないため、WeakHashMap でそのキーのルックアップを行うことは不可能です。 "
これは、weakhashmap のエントリ 0 のキーとして objectA を使用し、後でそのエントリを削除すると、別のエントリtestMapHashWeak.remove(objectA);
に同じキーobjectA
を使用できないということですか? 私は小さなテストを行ったので、それを行うことができます:
出力であること:
java - オブジェクトがガベージ コレクションされたときのログ記録
私のアプリケーションは、特定のオブジェクトの使用状況をログに記録します。私のセットアップでは、AspectJ を使用して、関心のあるコンテキストを識別し、これらの使用状況をログに記録します。後でログ ファイルを読み込んで分析しますが、効率上の理由から、オブジェクトに到達できなくなった時点を把握しておくと便利です。
私の現在のアプローチは、関心のあるオブジェクトを「ガベージ ロガー」でログに記録することです。これにより、オブジェクトの ID ハッシュ コードを含む「セーバー」オブジェクトが作成され、これが弱いハッシュ マップに格納されます。オブジェクトが収集されると、セーバー オブジェクトが弱いハッシュ マップから削除されて収集され、収集されたオブジェクトの ID ハッシュ コードをログに記録するコードが実行されるという考え方です。ガベージ コレクターでボトルネックが発生しないように、別のスレッドとキューを使用します。ガベージ ロガーのコードは次のとおりです。
私の問題は、これが非常に複雑に見えることです。スペースが必要でない限り、弱いハッシュ マップは必ずしもエントリをクリアするとは限らないため、オブジェクトが収集されてから記録するまでに長時間待機する可能性があります。基本的に、私はこれを達成するためのより良い方法を探しています。
注 - 私は任意のオブジェクトを監視しており、その作成を制御できないため、ファイナライズ メソッドをオーバーライドできません。
java - WeakHashMap と HashMap の比較
次のコード例では、キーが null に設定されてSystem.gc()
呼び出されると、WeakHashMap
はすべてのマッピングを失い、空になります。
Output: Weak Hash Map :{}
WeakHashMap
とともに使用されHashMap
、キーが null に設定されている場合、はWeakHashMap
そのキーと値のマッピングを失いません。
出力:
Weak Hash Map :{Java=Java, Hello=Hello, World=World, Programming=Programming}
Hash Map :{Programming=Programming, World=World, Java=Java, Hello=Hello}
WeakHashMap
私の質問は、キーが破棄された後でも、2 番目のコード例でエントリが失われないのはなぜですか?