Warum hält WeakHashMap einen starken Bezug zum Wert nach GC?
Key-Objekt in WeakHashMap wurde schwach erreichbar. Und Karte sollte der Eintrag nach GC entfernt werden. Ein starker Bezug zum Wertobjekt bleibt jedoch bestehen. Warum
Das gleiche Verhalten wird bei der Guaven-Schwachstellenkarte beobachtet.
Erwartete Ausgabe
...
refKey.get = null
refValue.get = null
Aber ich bekomme eine Ausgabe:
map.keys = []
map.values = []
map.size = 0
refKey.get = null
refValue.get = (123)
Code
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.WeakHashMap;
import com.google.common.collect.MapMaker;
public class Test {
static class Number {
final int number;
public Number(int number) { this.number = number; }
public String toString() { return "(" + number + ")"; }
}
static class Key extends Number {
public Key(int number) { super(number); }
}
static class Value extends Number {
public Value(int number) { super(number); }
}
public static void main(String args[]) {
//Map<Key, Value> map = new MapMaker().weakKeys().makeMap();
Map<Key, Value> map = new WeakHashMap<>();
Key key = new Key(1);
Value value = new Value(123);
map.put(key, value);
WeakReference<Key> refKey = new WeakReference<>(key);
WeakReference<Value> refValue = new WeakReference<>(value);
key = null;
value = null;
System.gc();
System.out.println("map.keys = " + map.keySet());
System.out.println("map.values = " + map.values());
System.out.println("map.size = " + map.size());
System.out.println("refKey.get = " + refKey.get());
System.out.println("refValue.get = " + refValue.get());
}
}
UPD:
Ich habe versucht, GC in jСonsole und jcmd durchzuführen, aber die Ausgabe wurde nicht geändert.