JavaRush /وبلاگ جاوا /Random-FA /تفاوت بین منابع ضعیف، نرم، فانتوم و معمولی در جاوا
theGrass
مرحله
Саратов

تفاوت بین منابع ضعیف، نرم، فانتوم و معمولی در جاوا

در گروه منتشر شد
مراجع "ضعیف" و مراجع "نرم" (WeakReference، SoftReference) مدتها پیش به Java API اضافه شده اند، اما هر برنامه نویسی با آنها آشنا نیست. این نشان دهنده شکاف در درک مکان و نحوه استفاده از آنها است. کلاس های مرجع به ویژه در زمینه جمع آوری زباله مهم هستند . همانطور که همه ما می دانیم، زباله جمع کننده خود حافظه اشغال شده توسط اشیاء را آزاد می کند، اما همه برنامه نویسان نمی دانند که تصمیم به آزادسازی حافظه را بر اساس نوع ارجاعات موجود به شی می گیرد. تفاوت بین لینک های ضعیف، نرم، فانتوم و معمولی در جاوا - 1تفاوت اصلی بین SoftReference و WeakReference این است که چگونه جمع کننده با آنها کار می کند. اگر فقط لینک های ضعیف به آن اشاره کنند، می تواند هر زمانی یک شی را حذف کند، از سوی دیگر، اشیاء با پیوند نرم تنها زمانی جمع آوری می شوند که JVM واقعاً به حافظه نیاز داشته باشد. با توجه به این ویژگی های کلاس های مرجع، هر یک از آنها کاربرد خاص خود را دارند. SoftReference می تواند برای پیاده سازی کش ها استفاده شود و زمانی که JVM به حافظه نیاز دارد با حذف چنین اشیایی آن را آزاد می کند. و WeakReferences برای ذخیره ابرداده، به عنوان مثال، ذخیره پیوند به یک ClassLoader عالی است. اگر هیچ کلاسی برای بارگیری وجود نداشته باشد، ذخیره یک مرجع به ClassLoader فایده ای ندارد ، یک مرجع ضعیف باعث می شود ClassLoader به محض اختصاص دادن آن به جای یک مرجع قوی، برای حذف در دسترس باشد. در این مقاله به تفاوت‌های بین انواع پیوندها از جمله مرجع قوی و مرجع فانتوم خواهیم پرداخت .

WeakReference در مقابل SoftReference در جاوا

برای کسانی که نمی دانند، 4 نوع پیوند وجود دارد:
  1. مرجع قوی
  2. مرجع ضعیف
  3. مرجع نرم
  4. مرجع فانتوم
پیوند قوی ساده ترین است، زیرا ما هر روز از آن در برنامه نویسی استفاده می کنیم، به عنوان مثال، در کدهایی مانند String s = "abc" متغیر s پیوند قوی است. حذف هر شیئی که دارای رفرنس قوی باشد توسط زباله جمع کن ممنوع است. البته اینها اشیایی هستند که برنامه جاوا به آنها نیاز دارد. مراجع ضعیف توسط کلاس java.lang.ref.WeakReference نشان داده می شوند ، می توانید یک مرجع ضعیف را مانند این تعریف کنید:
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
حال، هنگامی که شمارنده مرجع قوی را روی null قرار دهید (counter = null)، شی ایجاد شده در خط اول برای جمع آوری زباله در دسترس قرار می گیرد زیرا دیگر مرجع قوی ندارد. مرجع ضعیف Counter ایجاد شده توسط Weak نمی تواند مانع از حذف شی Counter توسط جمع کننده شود. از طرف دیگر، اگر یک مرجع Soft بود، شی Counter تا زمانی که JVM نیاز به حافظه زیادی نداشت، حذف نمی شد. مراجع نرم در جاوا با کلاس java.lang.ref.SoftReference نشان داده می شوند . نمونه ای از ایجاد SoftReference در جاوا
Counter prime = new Counter();  // prime holds a strong reference
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
پس از پاک کردن مرجع قوی (در خط 3)، تنها 1 مرجع نرم بر روی شی Counter باقی می ماند که نمی تواند مانع از حذف این شی توسط زباله جمع کننده شود، اما بر خلاف یک مرجع ضعیف، قادر خواهد بود. به تعویق انداختن این فرآیند تا زمانی که کمبود حاد حافظه وجود داشته باشد. با توجه به این تفاوت بین لینک های نرم و لینک های ضعیف، اولی برای حافظه پنهان و ضعیف برای ابرداده مناسب است. یک مثال خوب، کلاس WeakHashMap است که از نسل رابط Map مانند کلاس‌های HashMap یا TreeMap است ، اما با یک ویژگی متمایز. WeakHashMap کلیدها را به عنوان مرجع ضعیف قرار می دهد، به این معنی که به محض اینکه هیچ ارجاع قوی به یک شی وجود ندارد، مراجع ضعیفی که در داخل WeakHashMap قرار دارند شما را از جمع آوری زباله نجات نمی دهند. پیوندهای فانتوم سومین نوع پیوندهای موجود در بسته java.lang.ref هستند. مراجع فانتوم توسط کلاس java.lang.ref.PhantomReference نشان داده می شود . شیئی که فقط با پیوندهای فانتوم به آن اشاره می شود می تواند توسط جمع کننده در هر زمان حذف شود. پیوند فانتوم به همان روشی که پیوند ضعیف یا نرم ایجاد می شود.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
هنگامی که ارجاعات قوی به شی DigitalCounter را پاک کردید، گردآورنده زباله آن را در هر زمان حذف می کند، زیرا اکنون فقط ارجاعات فانتوم به آن اشاره می کنند. علاوه بر کلاس‌های WeakReference، SoftReference، PhantomReference، WeakHashMap، دانستن در مورد کلاس ReferenceQueue مفید است . هنگام ایجاد یک شی WeakReference، SoftReference یا PhantomReference می توانید از این کلاس استفاده کنید:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
مرجع شی به ReferenceQueue اضافه می شود و می توانید با نظرسنجی ReferenceQueue وضعیت مراجع را نظارت کنید. چرخه زندگی Object به خوبی در این نمودار نشان داده شده است: تفاوت بین منابع ضعیف، نرم، فانتوم و معمولی در جاوا - 2این همه تفاوت بین مراجع ضعیف و نرم در جاوا است . همچنین با لینک های فانتوم، کلاس WeakHashMap و ReferenceQueue آشنا شدیم . استفاده صحیح از منابع به جمع آوری زباله کمک می کند و منجر به مدیریت حافظه انعطاف پذیرتر در جاوا می شود . مقاله اصلی
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION