CodeGym /جاوا بلاگ /Random-UR /کچرا جمع کرنے والے کے بارے میں مزید
John Squirrels
سطح
San Francisco

کچرا جمع کرنے والے کے بارے میں مزید

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