Java มี reference 4 ระดับ ต่างกันในวิธีที่ Garbage Collector จัดการ:
1. Strong Reference (ปกติ)
ค่า default ของ reference ทุกตัว อ็อบเจกต์ที่มี strong reference อยู่ ไม่ถูก GC จนกว่าจะตัด reference ออก (set null)
class Demo { /* ... */ }
public class DemoExample {
public static void main(String[] args) {
Demo myInst = new Demo(); // strong reference
myInst = null; // ตอนนี้อาจถูก GC ได้
}
}
2. Weak Reference
ไม่ใช่ default ต้องระบุชัดเจน ใช้กับ WeakHashMap GC จะเก็บอ็อบเจกต์ที่มีแค่ weak reference ไปทันทีในรอบ GC ถัดไป สร้างด้วย java.lang.ref.WeakReference
import java.lang.ref.WeakReference;
class Demo {
public void displayMsg() { System.out.println("Hello"); }
}
public class DemoSample {
public static void main(String[] args) {
Demo inst = new Demo();
inst.displayMsg();
WeakReference myWeakRef = new WeakReference<>(inst);
inst = null; // ตัด strong reference
// อาจยังได้อ็อบเจกต์กลับมาถ้า GC ยังไม่ทำงาน
inst = myWeakRef.get();
if (inst != null) inst.displayMsg();
}
}
ผลลัพธ์
Hello Hello
3. Soft Reference
คงอ็อบเจกต์ไว้นานกว่า weak reference GC จะเก็บก็ต่อเมื่อ หน่วยความจำใกล้จะหมด เหมาะสำหรับแคช
4. Phantom Reference
อ่อนที่สุด get() คืนค่า null เสมอ ใช้ร่วม ReferenceQueue เพื่อรับแจ้งเมื่ออ็อบเจกต์จะถูกทำลายจริงๆ สำหรับ cleanup
สรุปลำดับความแข็งแกร่ง
Strong > Soft > Weak > Phantom
GC จะเก็บตามลำดับ: Phantom ก่อน → Weak → Soft → Strong (ไม่เก็บ)