Warning:Object.finalize() is deprecated since Java 9 and slated for removal. It is unreliable, slow, and can resurrect objects. Use Cleaner or try-with-resources instead.
Status
Java Version
Deprecated
9
Default disabled
Java 18 (--finalization=disabled)
Removal planned
Future LTS
10. Using Cleaner API
Example: Cleaner
private static final Cleaner CLEANER = Cleaner.create();public class Resource implements AutoCloseable { private final Cleaner.Cleanable cleanable; public Resource() { cleanable = CLEANER.register(this, () -> release(/* state */)); } public void close() { cleanable.clean(); } private static void release(Object state) { /* free native */ }}
Aspect
Detail
Action
Must NOT reference owner — use static state holder
Thread
Runs on cleaner-owned daemon thread
11. Understanding Reference Types
Type
GC Behavior
Strong
Never collected while reachable
Soft
Collected before OOM (memory-sensitive cache)
Weak
Collected at next GC
Phantom
Enqueued post-finalization; safer than finalize
12. Using Reference Queues
Example: Phantom + queue
ReferenceQueue<Object> q = new ReferenceQueue<>();PhantomReference<Object> ref = new PhantomReference<>(target, q);// background thread:while (true) { Reference<?> r = q.remove(); cleanup(r); }