JavaRush /جاوا بلاگ /Random-UR /جاوا میں کوڑا اٹھانے والے کے بارے میں مزید

جاوا میں کوڑا اٹھانے والے کے بارے میں مزید

گروپ میں شائع ہوا۔
ہیلو! آخری لیکچر میں، ہم سب سے پہلے جاوا زبان کے بلٹ ان میکانزم - کوڑا اٹھانے والے سے واقف ہوئے۔ یہ پس منظر میں کام کرتا ہے جب آپ کا پروگرام چل رہا ہوتا ہے، غیر ضروری چیزوں کو جمع کرتا ہے، جو بعد میں حذف کر دیے جائیں گے۔ اس طرح یہ مستقبل میں نئی ​​اشیاء بنانے کے لیے میموری کو آزاد کرتا ہے۔ اس لیکچر میں ہم اس کے آپریشن کے اصول پر گہری نظر ڈالیں گے۔ مثلاً کوئی چیز کیسے اور کس مقام پر غیر ضروری ہو جاتی ہے؟ اور کچرا اٹھانے والے کو اس کے بارے میں کیسے علم ہے؟ ہم ان سوالوں کا جواب دیں گے :) ہمارا لیکچر ایک جائزہ سے زیادہ ہے: اس مواد کو حفظ کرنے کی ضرورت نہیں ہے۔ اس کا مقصد میموری کے کام اور کوڑا اٹھانے والے کے بارے میں آپ کے افق کو وسیع کرنا ہے، لہذا اسے پڑھنا اور اپنے لیے کچھ نیا سیکھنا کافی ہوگا :) چلیں! پہلی چیز جو آپ کو یاد رکھنے کی ضرورت ہے وہ یہ ہے کہ کوڑا اٹھانے والا آپ کے پروگرام کے متوازی چلتا ہے ۔ یہ اس کا حصہ نہیں ہے اور الگ سے کام کرتا ہے: اس کو بیان کرنے کے لیے، آخری لیکچر میں ہم نے روبوٹ ویکیوم کلینر سے مشابہت دی تھی۔ درحقیقت ہمیشہ ایسا نہیں تھا۔ پہلے، کوڑا اٹھانے والے کو اس طرح سے ڈیزائن کیا گیا تھا کہ یہ آپ کے پروگرام کے دھاگے میں کام کرتا تھا۔ اور کچھ شیڈول کے مطابق، ہر چند منٹ میں ایک بار، اس نے پروگرام میں غیر ضروری اشیاء کی موجودگی کی جانچ شروع کردی۔ مسئلہ یہ تھا کہ اس چیک اور کوڑا کرکٹ جمع کرنے کے دوران پروگرام منجمد ہوگیا اور اس پر عمل نہیں ہوا۔ تصور کریں کہ آپ دفتر میں بیٹھ کر کام کر رہے ہیں۔ لیکن پھر ایک صفائی کرنے والی خاتون آتی ہے اور اسے کمرے میں فرش دھونے کی ضرورت ہوتی ہے۔ وہ آپ کو 5 منٹ کے لیے کمپیوٹر کے پیچھے سے باہر نکال دیتی ہے اور آپ اس وقت تک انتظار کرتے ہیں جب تک وہ صفائی مکمل نہیں کر لیتی۔ اس دوران آپ کام نہیں کر سکتے۔ کچرا اٹھانے والے تقریباً اس طرح کام کرتے تھے :) بعد میں، اس طریقہ کار کو تبدیل کر دیا گیا، اور اب کوڑا اٹھانے والا بیک گراؤنڈ میں کام کرتا ہے، پروگرام کے کام کو سست کیے بغیر۔ آپ پہلے ہی جان چکے ہیں کہ کوئی چیز اس وقت مر جاتی ہے جب اس کا کوئی حوالہ باقی نہ رہے۔ لیکن کچرا جمع کرنے والا اصل میں حوالہ جات کو شمار نہیں کرتا ہے ۔ سب سے پہلے، یہ کافی طویل ہو سکتا ہے. دوم، یہ بہت مؤثر نہیں ہے. سب کے بعد، اشیاء ایک دوسرے کا حوالہ دے سکتے ہیں! کوڑا اٹھانے والے کے بارے میں مزید - 2اعداد و شمار ایک مثال دکھاتا ہے جہاں 3 اشیاء ایک دوسرے کا حوالہ دیتے ہیں، لیکن کوئی بھی ان کا حوالہ نہیں دیتا ہے۔ یعنی باقی پروگرام کے کام کرنے کے لیے ان کی ضرورت نہیں ہے۔ اگر کوڑا اٹھانے والا محض حوالہ جات گن رہا ہوتا تو یہ تینوں اشیاء باقی رہ جاتیں اور یادداشت کو خالی نہیں کرتیں: ان کے حوالے موجود ہیں! اس کا موازنہ خلائی جہاز سے کیا جا سکتا ہے۔ پرواز کے دوران، خلابازوں نے مرمت کے لیے اسپیئر پارٹس کی فہرست چیک کرنے کا فیصلہ کیا اور ان میں سے ایک عام کار کا اسٹیئرنگ وہیل اور پیڈل ملے۔ واضح طور پر یہاں ان کی ضرورت نہیں ہے اور اضافی جگہ لیتے ہیں۔ اگرچہ یہ حصے جڑے ہوئے ہیں اور ان کے کچھ کام ہیں، خلائی جہاز کے آپریشن کے فریم ورک کے اندر وہ غیر ضروری کوڑا کرکٹ ہیں، جس سے چھٹکارا حاصل کرنا بہتر ہے۔ لہذا، جاوا نے ردی کی ٹوکری کو جمع کرنے کی بنیاد بنانے کا فیصلہ کیا حوالہ جات کو شمار نہیں کیا، بلکہ اشیاء کو دو اقسام میں تقسیم کیا - قابل رسائی اور ناقابل رسائی. اس بات کا تعین کیسے کریں کہ آیا کوئی چیز قابل رسائی ہے؟ ہوشیار ہر چیز آسان ہے۔ ایک چیز قابل رسائی ہے اگر اس کا حوالہ کسی اور قابل رسائی شے کے ذریعہ دیا جائے۔ اس کے نتیجے میں "رسائی کا سلسلہ" پیدا ہوتا ہے۔ یہ اس وقت شروع ہوتا ہے جب پروگرام شروع ہوتا ہے اور اس کے آپریشن کی پوری مدت میں جاری رہتا ہے۔ یہ کچھ اس طرح لگتا ہے: کوڑا اٹھانے والے کے بارے میں مزید - 4شکل میں تیر ہمارے پروگرام کے عمل کوڈ کی نشاندہی کرتا ہے۔ کوڈ میں، مثال کے طور پر main() طریقہ میں، اشیاء کے حوالے بنائے جاتے ہیں۔ یہ اشیاء نئی اشیاء کا حوالہ دے سکتی ہیں، وہ کچھ اور، وغیرہ۔ آبجیکٹ لنکس کا ایک سلسلہ بنتا ہے ۔ اگر کسی "روٹ لنک" کے لنکس کی اس زنجیر کے ذریعے کسی شے تک پہنچا جا سکتا ہے، یعنی جو براہ راست ایگزیکیوٹنگ کوڈ میں بنایا گیا ہے، تو اسے قابل رسائی سمجھا جاتا ہے۔ ہماری تصویر میں انہیں نیلے رنگ میں دکھایا گیا ہے۔ لیکن اگر کوئی چیز اس زنجیر سے باہر ہو گئی ہے، یعنی اس وقت جو کوڈ پر عمل کیا جا رہا ہے ان میں سے کسی بھی متغیر میں اس کا حوالہ نہیں ہے، اور "لنکس کی زنجیر" کے ذریعے اس تک پہنچنا بھی ناممکن ہے - اسے ناقابل رسائی سمجھا جاتا ہے۔ ہمارے پروگرام میں ایسی دو اشیاء کو سرخ رنگ میں دکھایا گیا ہے۔ براہ کرم نوٹ کریں: یہ "سرخ" اشیاء ایک دوسرے سے روابط رکھتی ہیں۔ لیکن، جیسا کہ ہم نے پہلے کہا، جاوا میں جدید کچرا جمع کرنے والا حوالہ گنتی نہیں کرتا ہے۔ یہ طے کرتا ہے کہ آیا کوئی چیز قابل رسائی ہے یا ناقابل رسائی ۔ اس لیے تصویر میں نظر آنے والی دو سرخ چیزیں اس کا شکار بن جائیں گی۔ اب آئیے شروع سے ختم ہونے تک پورے عمل کو دیکھتے ہیں، اور ساتھ ہی دیکھتے ہیں کہ جاوا میں میموری کیسے کام کرتی ہے :) جاوا میں تمام اشیاء کو ایک خاص میموری والے حصے میں ذخیرہ کیا جاتا ہے جسے ہیپ کہتے ہیں ۔ عام زبان میں، "ڈھیر" اشیاء کا ایک پہاڑ ہے جہاں ہر چیز گڑبڑ میں پڑی ہوتی ہے۔ لیکن جاوا میں ڈھیر ایسا نہیں ہے۔ اس کا ایک بہت ہی منطقی اور معقول ڈھانچہ ہے۔ ایک اچھے دن، جاوا پروگرامرز نے دریافت کیا کہ ان کے پروگراموں میں موجود تمام اشیاء کو دو قسموں میں تقسیم کیا جا سکتا ہے - نسبتاً بولنے والی، سادہ اشیاء اور "طویل عمر والی" ۔ "طویل المدت" اشیاء وہ ہیں جو بہت سے کوڑا کرکٹ جمع کرنے سے بچ گئی ہیں۔ اکثر وہ پروگرام کے اختتام تک موجود رہیں گے۔ نتیجے کے طور پر، مشترکہ ڈھیر، جہاں تمام تخلیق شدہ اشیاء کو ذخیرہ کیا جاتا ہے، کئی حصوں میں تقسیم کیا گیا تھا. پہلے حصے کا ایک خوبصورت نام ہے - ایڈن (بائبل کا "باغ عدن")۔ یہ ایک عظیم نام ہے کیونکہ یہ وہ جگہ ہے جہاں اشیاء تخلیق ہونے کے بعد جاتی ہیں۔ یہ اس حصے میں ہے کہ جب ہم لکھتے ہیں تو میموری کو نئی اشیاء کے لئے مختص کیا جاتا ہے۔new. بہت سی اشیاء بنائی جا سکتی ہیں، اور جب اس علاقے میں جگہ ختم ہو جاتی ہے، تو پہلا، "تیز" کچرا جمع کرنا شروع ہو جاتا ہے۔ یہ کہنا ضروری ہے کہ کوڑا اٹھانے والا بہت ہوشیار ہے اور اس بات پر منحصر ہے کہ ڈھیر میں زیادہ کیا ہے - کوڑا کرکٹ یا کام کرنے والی اشیاء۔ اگر تقریباً تمام اشیاء کوڑا کرکٹ ہیں، تو کلیکٹر "زندہ" اشیاء کو نشان زد کرتا ہے اور انہیں کسی دوسرے میموری ایریا میں لے جاتا ہے، جس کے بعد موجودہ جگہ کو مکمل طور پر صاف کر دیا جاتا ہے۔ اگر تھوڑا سا کچرا ہے اور اس کا زیادہ تر حصہ جاندار چیزوں کے قبضے میں ہے تو وہ کوڑے کو نشان زد کرتا ہے، اسے صاف کرتا ہے اور باقی چیزوں کو ترتیب دیتا ہے۔ ہم نے کہا "کلیکٹر "زندہ" اشیاء کو نشان زد کرتا ہے اور انہیں کسی اور میموری والے مقام پر منتقل کرتا ہے، لیکن کون سا؟ میموری کا وہ علاقہ جہاں کم از کم ایک کچرا جمع کرنے والی تمام اشیاء کو منتقل کیا جاتا ہے اسے سروائیول اسپیس کہا جاتا ہے ۔ بقا کی جگہ، بدلے میں، نسلوں میں تقسیم ہوتی ہے ۔ ہر آبجیکٹ کو اس بنیاد پر ایک نسل تفویض کی جاتی ہے کہ اس نے کتنے کوڑا کرکٹ اکٹھا کرنے کا تجربہ کیا ہے۔ اگر کوئی ہے تو اس کا تعلق "جنریشن 1" سے ہے، اگر 5 ہے تو - "جنریشن 5" سے۔ ایڈن اور سروائیول اسپیس مل کر ینگ جنریشن کے نام سے ایک علاقہ بناتے ہیں ۔ ینگ جنریشن کے علاوہ، ڈھیر میں ایک اور میموری ایریا ہے - اولڈ جنریشن ("پرانی نسل")۔ یہ بہت طویل عرصے تک رہنے والی اشیاء ہیں جو بہت سے کوڑا کرکٹ جمع کرنے سے بچ گئی ہیں۔ ان کو باقی سب سے الگ ذخیرہ کرنا زیادہ منافع بخش ہے۔ اور صرف اس وقت جب اولڈ جنریشن کا علاقہ بھر جائے، یعنی یہاں تک کہ پروگرام میں اتنی دیرپا چیزیں ہیں کہ کافی میموری نہیں ہے، ایک مکمل کوڑا کرکٹ جمع کیا جاتا ہے۔ یہ صرف ایک میموری ایریا پر کارروائی نہیں کرتا ہے، بلکہ عام طور پر جاوا مشین کے ذریعہ تخلیق کردہ تمام اشیاء پر کارروائی کرتا ہے۔ قدرتی طور پر، یہ بہت زیادہ وقت اور وسائل لیتا ہے. یہی وجہ ہے کہ طویل عرصے تک رہنے والی اشیاء کو الگ سے ذخیرہ کرنے کا فیصلہ کیا گیا۔ جب دوسرے علاقوں میں جگہ ختم ہو جاتی ہے، تو نام نہاد "تیزی سے کچرا جمع کرنا" کیا جاتا ہے۔ یہ صرف ایک علاقے پر محیط ہے، اور اس کی وجہ سے یہ زیادہ اقتصادی اور تیز ہے۔ آخر میں، جب یہاں تک کہ صد سالہ افراد کا علاقہ پہلے ہی بھرا ہوا ہے، مکمل صفائی میدان میں آ جاتی ہے۔ اس طرح، سب سے زیادہ "بھاری" ٹول کو اسمبلر صرف اس وقت استعمال کرتا ہے جب اس کی مزید ضرورت نہ ہو۔ سکیماتی طور پر، ڈھیر اور صفائی کی ساخت اس طرح نظر آتی ہے: کوڑا اٹھانے والے کے بارے میں مزید - 5
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION