ارجاع ضعیف (Weak reference) در جاوا

در این مطلب به مفهوم ارجاع ضعیف (weak reference) در جاوا میپردازیم.
قبل از اینکه شروع کنیم، برخی مقدمات را با هم مرور میکنیم.
۴ نوع ارجاع متفاوت در جاوا وجود دارد:
- ارجاع قوی (Strong reference)
- ارجاع ضعیف (Weak reference)
- ارجاع نرم (Soft reference)
- ارجاع شبح (Phantom reference)
در این مطلب فقط میخواهیم به معرفی ارجاع ضعیف بپردازیم.
ارجاع ضعیف، ارتباط تنگاتنگی با زبالهروب جاوا دارد. عملیات زبالهروبی (Garbage collection) به بیان ساده، عملیات آزادسازی خودکار حافظهای است که به آن هیچ ارجاعی وجود ندارد.
ارجاع ضعیف، ارجاعی است که به اندازه کافی قوی نیست تا باعث شود شیای که به آن اشاره میکند در حافظه باقی بماند. به بیان دیگر تصمیم اینکه شی مورد بحث قابل زبالهروبی هست یا نه را به خود زبالهروب واگذار میکنند.
جاوا به طور پیشفرض، ارجاعها را به صورت قوی (همان ارجاع معمولی که تا کنون از آن استفاده میکردیم) تعریف میکند. برای داشتن یک ارجاع به صورت ضعیف، باید این موضوع را موقع تعریف کردن، مشخص کنیم.
«قابلیت دسترسی» ضعیف چیست؟
«قابلیتِ دسترسی» ضعیف (weak reachability) به این معناست که هیچ ارجاع قوی یا نرمی (soft) به این شی وجود ندارد و تنها راه دسترسی به آن، از طریقِ یک ارجاع ضعیف است.
شیای که «قابلیت دسترسی» ضعیف دارد، توسط زبالهروب حذف میشود و فضای اشغالشده توسطِ آن آزاد میشود و باعث بهبود مدیریت حافظه میشود.
از ارجاعهای ضعیف کجا استفاده میشود؟
- از ارجاعهای ضعیف بیشتر در نگاشت کانونیشده (canonicalized mappings) استفاده میشود. نگاشت کانونیشده زمانی است که نگاشت، فقط یک نمونه از یک مقدار خاص را نگه میدارد. مطالعه بیشتر
- از ارجاعهای ضعیف همچنین به صورت گسترده در کلاس WeakHashMap استفاده شدهاست. این یکی از پیادهسازیهای واسط Mapاست که کلید و مقدار به صورت ارجاع ضعیف نگهداری میشوند. در صورتی که کلید توسط زبالهروب پاک شود، آن جفت کلید و مقدار از نگاشت حذف خواهند شد.
نمونه کد:
Private static class TryingOut<K,V> extends WeakReference <Object> implements Map.Entry <K,V>
- مسئلهٔ Lapsed Listener هم از ارجاع ضعیف استفاده میکند. مشکلات نشت حافظه در این مورد، به کمک ارجاع ضعیف حل میشوند.
پیادهسازیِ ارجاعهای ضعیف
کلاس java.lang.ref.WeakReference برای استفاده و ساخت ارجاعهای ضعیف استفاده میشود.
یک سناریوی واقعیِ استفاده از ارجاع ضعیف، زمانی است که میخواهیم اتصالی به دیتابیس داشته باشیم که بتواند در صورت خاتمه برنامه اصلی، توسط زبالهروب پاک شود.
نمونه کدی که از ارجاع ضعیف استفاده میکند نمایش داده شدهاست:
// Illustrating Weak references in Java import java.lang.ref.WeakReference; class WeakestRef { //coding starts from here public void something() { System.out.println("This is printed out on the screen"); } } public class TryingOutWeak { public static void main(String[] args) { // Strong Reference WeakestRef obj1 = new WeakestRef (); obj1.something(); // Creating Weak Reference to WeakestRef -type object to which 'obj1' is also pointing. WeakReference< WeakestRef > weakref = new WeakReference< WeakestRef >(obj1); //Now, WeakestRef -type object to which 'obj1' was pointing earlier is not available for garbage //collection. But will be only be garbage collected when JVM needs memory. Obj1 = null; // Note: You can also retrieve back the object which has been weakly referenced. It succesfully //calls the method. Obj1 = weakref.get(); Obj1.something(); } }
این مقاله ترجمهای از این مطلب از سایت Java Tutorial Network است.
.
.
.
.
با ما همراه باشید
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers