Types of References in Java
چهار نوع رفرنس توی جاوا داریم:
Strong References: این حالت پیشفرض رفرنس دهی توی جاواست. اشیایی که این نوع رفرنس رو دارن توسط GC پاک نمیشن. این رفرنس زمانی نابود میشه که رفرنس اون به null اشاره کنه.
MyObject x = new MyObject(); // strong reference
x = null; //points to null and eligible for GC.
Weak References: برای تعریف این نوع رفرنس باید صریحا اون رو بیان کنیم و از WeakHashMap برای رفرنس دهی استفاده میکنه. اگه GC یک شی رو با این نوع رفرنس پیدا کنه اون رو برای حذف علامت میزنه. برای ساختش باید از java.lang.ref.WeakReference استفاده کنیم. این نوع رفرنس معمولا برای شرایطی کاربرد داره که ما یکسری محدودیت داریم و میخوایم مطمئن بشیم که اون شی راحت نابود میشه. مثل کانکشن دیتابیس.
WeakReference x = new WeakReference(new MyObject());
دو سطح متفاوت از رفرنس دهی ضعیف داریم:
Soft References: توی این حالت شی برای حذف واجد شرایط نمیشه مگر اینکه JVM به حافظه نیاز داشته باشه و برای ساختنش باید از java.lang.ref.SoftReference استفاده کنیم.
Phantom References: توی این حالت شی از اول برای حذف واجد شرایط هست و در اولین چرخه GC نابود میشه و لازم نیست منتظر چرخه دوم برای نابودی باشه. به عبارت دیگه این اشیا گارانتی میکنن که وسط نابودی زنده نشن. و JVM متد finalize اون رو صدا میزنه و اون رو میندازه توی یک صف به اسم reference queue که این به معنی هستش که این رفرنس برای تخصیص به یک شی دیگه آزاده. برای ساختنش باید از java.lang.ref.PhantomReference استفاده کنیم.