Überprüfen Sie die Funktion von Java Weak Reference.
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
public class Main {
static class Entry{
private final String name;
public Entry(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public static void main(String[] args) {
var val = new Entry("Hello");
var ref = new WeakReference<>(val);
System.out.println("ref: "+ val + ", weak-ref: "+ ref.get());
System.out.println("gc");
System.gc();
System.out.println("ref: "+ val + ", weak-ref: "+ ref.get());
System.out.println("e = null");
val = null;
System.out.println("gc");
System.gc();
System.out.println("ref: "+ val + ", weak-ref: "+ ref.get());
}
}
Das Ausführungsergebnis ist wie folgt.
ref: Hello, weak-ref: Hello
gc
ref: Hello, weak-ref: Hello
e = null
gc
ref: null, weak-ref: null
Apropos, var e = "Hello"; Aber ich habe das gleiche Ergebnis erwartet, aber es blieb ohne GC.
ref: Hello, weak-ref: Hello
gc
ref: Hello, weak-ref: Hello
e = null
gc
ref: null, weak-ref: Hello
Wahrscheinlich, weil der Code selbst "Hallo" enthält, ist es sehr wahrscheinlich, dass er nicht für GC bestimmt war. Daher wurde das gleiche Ergebnis durch explizit neues wie folgt erhalten.
var e = new String("Hello");
Beachten Sie, dass valueOf ohne Berechtigung zwischengespeichert wird, auch wenn Sie es mit Integer anstelle von String versuchen.