Warum wird eine PhantomReference in die Warteschlange gestellt, bevor Cleaner ausgeführt wird, wenn das Objekt während dJava

Java-Forum
Anonymous
 Warum wird eine PhantomReference in die Warteschlange gestellt, bevor Cleaner ausgeführt wird, wenn das Objekt während d

Post by Anonymous »

Ich experimentiere mit dem Verhalten des Objektlebenszyklus auf niedriger Ebene in der JVM (Java 17, HotSpot), einschließlich PhantomReference, ReferenceQueue, Cleaner und Objektwiederbelebung während der Finalisierung.
Betrachten Sie den folgenden Code:

Code: Select all

import java.lang.ref.*;

import java.util.concurrent.atomic.AtomicReference;

public class PhantomTest {

static AtomicReference resurrected = new AtomicReference();

static class Resource {

@Override

protected void finalize() throws Throwable {

// resurrect object

resurrected.set(this);

}

}

public static void main(String[] args) throws Exception {

ReferenceQueue queue = new ReferenceQueue();

Object obj = new Resource();

PhantomReference phantom =

new PhantomReference(obj, queue);

Cleaner cleaner = Cleaner.create();

cleaner.register(obj, () ->

System.out.println("Cleaner executed"));

obj = null;

System.gc();

Thread.sleep(200);

Reference ref = queue.poll();

System.out.println("Phantom enqueued: " + (ref != null));

System.out.println("Resurrected: " + (resurrected.get() != null));

}

}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post