Phase 14 of 20 · Topic 14.4

Reference Types: Strong, Soft, Weak & Phantom

1Concept

Java provides 4 reference strengths in `java.lang.ref`: 1. Strong Reference (standard `new Object()`, never collected if reachable); 2. SoftReference (collected ONLY when JVM runs low on memory, ideal for memory-sensitive caches); 3. WeakReference (collected eagerly at the next GC cycle, ideal for WeakHashMap); 4. PhantomReference (enqueued in ReferenceQueue after finalization, used for native resource cleanup via Cleaner API).

2Architecture Diagram

Reference Strength Spectrum:
Strong > Soft (Cleared before OOM) > Weak (Cleared on next GC) > Phantom (Post-mortem tracking)

3Code Example

Core Java
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

public class ReferenceTypesDemo {
    public static void main(String[] args) {
        // Strong Reference
        String strong = new String("Strong Reference");

        // Weak Reference
        WeakReference<String> weakRef = new WeakReference<>(new String("Weakly Reachable Data"));
        System.out.println("Before GC weakRef.get(): " + weakRef.get());

        // Soft Reference (ideal for memory-sensitive caches)
        SoftReference<String> softRef = new SoftReference<>(new String("Cached Image Data"));
        System.out.println("softRef.get(): " + softRef.get());

        System.gc(); // Hint JVM to trigger Garbage Collection
        System.out.println("After GC weakRef.get(): " + weakRef.get() + " (Reclaimed if collected!)");
    }
}

4Expected Output

Before GC weakRef.get(): Weakly Reachable Data
softRef.get(): Cached Image Data
After GC weakRef.get(): null (Reclaimed if collected!)

5Key Takeaways

  • Use `WeakHashMap` when keys should be discarded when no longer strongly referenced elsewhere.
  • Use `java.lang.ref.Cleaner` instead of `finalize()` for modern safe native memory deallocation.
  • SoftReferences are cleared before OutOfMemoryError is thrown.