İşte benim kod Çok garip, rq.remove() sonsuza engellenecektir oluyorNihai bir nesne için neden PhantomReference'ı ReferenceQueue'dan alamıyorum?
public class FinalizableObject {
@Override
protected void finalize() throws Throwable {
System.out.println("finalize() invoked for " + this);
super.finalize();
}
}
public class Main {
private static void test() throws InterruptedException {
ReferenceQueue<FinalizableObject> rq = new ReferenceQueue<FinalizableObject>();
FinalizableObject obj = new FinalizableObject();
PhantomReference<FinalizableObject> pr1 = new PhantomReference<FinalizableObject>(obj, rq);
obj = null;
System.gc();
Reference<? extends Object> ref = rq.remove();
System.out.print("remove " + ref + " from reference queue\n");
}
public static void main(String[] args) {
try {
test();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
olduğunu. Sonuçlandırılabilir nesnemin fantom referansı neden referans sırasına konamaz? GC toplandı mı?
Çok teşekkür ederim.
FinalizerReferenceQueue ve FinalizerDeamon'u biliyorum, GC'nin 2 katı tamamlanmış bir nesneyi tam olarak toplayabilir. Ama neden 100 kez GC'nin toplanmasını tetikleyeceğini anlayamıyorum (GC'nin 20 katı bile enseçiliği tetikleyemez).
Diğer taraftan, PhantomReference'ı WeakReference ile değiştirirsem, referansı çok hızlı bir şekilde kaldırabilir.
–
@DevboardFan Bunun nedeni, önemsiz olmayan 'finalize()' yöntemini çağırmak için JVM'nin ayrıca toplanması ve bitirilmesi gereken özel Finalizer-Thread oluşturmasıdır. – Andremoniy
Çok teşekkür ederim! –