JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ ڪمزور، نرم، پريتم ۽ باقاعده حوالن جي وچ ۾ فرق
theGrass
سطح
Саратов

جاوا ۾ ڪمزور، نرم، پريتم ۽ باقاعده حوالن جي وچ ۾ فرق

گروپ ۾ شايع ٿيل
"ضعيف" حوالا ۽ "نرم" حوالا (WeakReference، SoftReference) جاوا API ۾ گهڻو وقت اڳ شامل ڪيا ويا ، پر هر پروگرامر انهن کان واقف ناهي. اهو اشارو ڪري ٿو ته انهن کي ڪٿي ۽ ڪيئن استعمال ڪجي سمجهڻ ۾ هڪ فرق. ريفرنس ڪلاس خاص طور تي ڪچرو گڏ ڪرڻ جي حوالي سان اهم آهن . جيئن ته اسان سڀ ڄاڻون ٿا، ڪچرو ڪليڪٽر پاڻ کي شيون جي قبضي واري ميموري کي آزاد ڪري ٿو، پر سڀني پروگرامرن کي خبر ناهي ته اهو ميموري کي آزاد ڪرڻ جو فيصلو ڪري ٿو اعتراض جي حوالي سان موجود قسم جي بنياد تي. SoftReference ۽ WeakReferenceجاوا ۾ ڪمزور، نرم، پريتم ۽ باقاعده لنڪ جي وچ ۾ فرق - 1 جي وچ ۾ بنيادي فرق اهو آهي ته ڪليڪٽر انهن سان ڪيئن ڪم ڪندو. اهو ڪنهن به وقت هڪ اعتراض کي ختم ڪري سگهي ٿو جيڪڏهن صرف ڪمزور لنڪس ان ڏانهن اشارو ڪن ٿا، ٻئي طرف، نرم لنڪ سان شيون گڏ ڪيون وينديون صرف جڏهن 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) تي مقرر ڪيو، پهرين لڪير ۾ ٺاهيل اعتراض ڪچرو گڏ ڪرڻ لاءِ دستياب ٿي ويندو آهي ڇاڪاڻ ته اهو هاڻي مضبوط حوالو ناهي. Weak پاران ٺاهيل ڪمزور ڪائونٽر ريفرنس ڪليڪٽر کي ڪائونٽر اعتراض کي ختم ڪرڻ کان روڪي نٿو سگهي. ٻئي طرف، جيڪڏھن اھو ھڪڙو نرم حوالو ھو، ڪاؤنٽر اعتراض کي ختم نه ڪيو ويندو جيستائين 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
مضبوط ريفرنس کي صاف ڪرڻ کان پوءِ (ٽين لائين ۾)، صرف 1 نرم ريفرنس رهجي ويندو Counter Object تي، جيڪو گندي ڪليڪٽر کي هن اعتراض کي حذف ڪرڻ کان روڪي نه سگهندو، پر ڪمزور ريفرنس جي برعڪس، اهو قابل هوندو. ھن عمل کي ملتوي ڪرڻ تائين جيستائين ميموري جي شديد کوٽ آھي. نرم لنڪس ۽ ضعيف لنڪس جي وچ ۾ هن فرق کي ڏنو ويو آهي، پهرين ڪيچ لاء وڌيڪ مناسب آهي، ۽ ميٽا ڊيٽا لاء ڪمزور. ھڪڙو سٺو مثال آھي WeakHashMap ڪلاس، جيڪو آھي Map انٽرفيس جو اولاد آھي HashMap يا TreeMap طبقن وانگر ، پر ھڪڙي خاص خصوصيت سان. WeakHashMap ڪنجين کي ڪمزور حوالن جي طور تي لپي ٿو، جنهن جو مطلب آهي ته جيئن ئي ڪنهن شئي لاءِ ڪو مضبوط حوالو نه هوندو، ڪمزور حوالا جيڪي WeakHashMap جي اندر موجود هوندا آهن ، توهان کي ڪچري جي ڪليڪٽر کان نه بچائي سگهندا. Phantom لنڪس ٽئين قسم جون لنڪس آهن جيڪي 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 کي پولنگ ڪندي حوالن جي حالت مانيٽر ڪري سگھو ٿا. آبجیکٹ جي زندگيءَ جو چڪر هن آريگرام ۾ چڱيءَ طرح پيش ڪيو ويو آهي: جاواجاوا ۾ ڪمزور، نرم، پريتم ۽ باقاعده حوالن جي وچ ۾ فرق - 2 ۾ ڪمزور ۽ نرم حوالن جي وچ ۾ اهو سڀ فرق آهي . اسان پريتم لنڪس، WeakHashMap ڪلاس ۽ ReferenceQueue سان پڻ واقف ٿي چڪا آهيون . حوالن کي صحيح طريقي سان استعمال ڪرڻ سان ڪچرو گڏ ڪرڻ ۾ مدد ملندي ۽ نتيجي ۾ جاوا ۾ وڌيڪ لچڪدار ميموري مئنيجمينٽ ٿيندو . اصل مضمون
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION