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.