2

マップを格納する 1 つのクラスと、そのクラスのメソッドを呼び出すボタンを含むテスト アプリケーションがあります。

Map<Object, Object> weakMap = new WeakHashMap<Object, Object>();

ボタンはこれを行います:

public void fillWeakHashMap(int size) {
    List<String> createObjects = (List<String>) createObject(size);
    for (Object ob : createObjects) {
        weakMap.put(ob, ob);
    }
}

したがって、マップを持つメインクラスは生きていますが、そこに配置したオブジェクトは別のメソッドで作成されます。メソッドを終了した後、マップ内のキー/オブジェクトはGCによってクリアされるWeakHashMapと思いました。fillWeakHashMap

VisualVM->VisualGC を開き、Monitor->PerformGC を 10 回クリックしましたが、GC がこれらのオブジェクトをクリアしていないことを意味する古い領域がほぼいっぱいです。それで、私は何を間違っていますか?

4

2 に答える 2

9

WeakHashMap の javadoc の最初の文には次のように書かれています。

弱いキーを使用した Map インターフェイスのハッシュ テーブル ベースの実装。WeakHashMap のエントリは、そのキーが通常使用されなくなったときに自動的に削除されます。より正確には、特定のキーのマッピングが存在しても、キーがガベージ コレクターによって破棄されること、つまり、ファイナライズ可能になり、ファイナライズされてから再利用されることを防ぐことはできません。キーが破棄されると、そのエントリは事実上マップから削除されるため、このクラスは他の Map 実装とは多少異なる動作をします。

そして少し下に、次のように書いています。

WeakHashMap の値オブジェクトは、通常の強い参照によって保持されます。したがって、値オブジェクトがそれ自体のキーを直接的または間接的に強く参照しないように注意する必要があります。これにより、キーが破棄されるのを防ぐことができます。

つまり、キーのみが弱く参照され、値は強く参照されます。コードでは、各キーも値として使用されるため、強く参照されるため、ガベージ コレクションは行われません。

于 2015-05-02T15:20:01.250 に答える