CodeGym /وبلاگ جاوا /Random-FA /اطلاعات بیشتر در مورد زباله جمع کن
John Squirrels
مرحله
San Francisco

اطلاعات بیشتر در مورد زباله جمع کن

در گروه منتشر شد
سلام! در درس آخر، ابتدا با زباله جمع‌آور داخلی جاوا آشنا شدیم و به طور تقریبی از نحوه عملکرد آن مطلع شدیم. در حالی که برنامه شما در حال اجرا است در پس زمینه کار می کند و اشیاء غیر ضروری را جمع آوری می کند که بعداً حذف خواهند شد. بنابراین، حافظه را آزاد می کند که می توان از آن برای ایجاد اشیاء جدید در آینده استفاده کرد.
اطلاعات بیشتر در مورد زباله جمع کن - 1
در این درس، با جزئیات بیشتری درباره نحوه کارکرد آن صحبت خواهیم کرد. به عنوان مثال، چگونه و چه زمانی یک شی غیر ضروری می شود؟ و چگونه زباله جمع کن متوجه می شود؟ اینها سوالاتی هستند که در طول درس امروز به آنها پاسخ خواهیم داد :) درس بیشتر شبیه یک مرور کلی خواهد بود: نیازی نیست این مطالب را از روی قلب یاد بگیرید. هدف اصلی این است که دید خود را در مورد نحوه عملکرد حافظه و زباله جمع کن گسترش دهید، بنابراین فقط بخوانید و چیز جدیدی برای خود پیدا کنید :) بیایید برویم! اولین چیزی که باید به خاطر بسپارید این است که زباله جمع کن موازی با برنامه شما کار می کند . بخشی از برنامه شما نیست. به طور جداگانه اجرا می شود (در درس گذشته، ما این را با یک جاروبرقی روبات مقایسه کردیم) اما همیشه اینطور نبود. جمع‌آوری زباله قبلاً روی همان رشته برنامه شما انجام می‌شد. در برخی برنامه ها (هر چند دقیقه یک بار)، زباله جمع کن وجود اشیاء ناخواسته را در برنامه بررسی می کند. مشکل این بود که برنامه در طول این بررسی و جمع آوری زباله هنگ می شد (اجرا نمی شد). تصور کنید در محل کار خود در دفتر خود نشسته اید. اما بعد خانم نظافتچی وارد می شود تا کف ها را بشوید. او شما را به مدت 5 دقیقه از کامپیوتر دور می کند و شما منتظر می مانید تا تمیز کردن او تمام شود. در این مدت، شما قادر به کار نیستید. جمع‌آوری زباله قبلاً اینگونه کار می‌کرد :) این مکانیسم بعداً تغییر کرد و اکنون زباله‌گیر در پس‌زمینه اجرا می‌شود و مانع کار خود برنامه نمی‌شود. شما قبلاً می دانید که یک شی زمانی می میرد که دیگر مرجعی نداشته باشد. در واقعیت، جمع‌آورنده زباله، ارجاعات اشیا را حساب نمی‌کند . اول، این ممکن است زمان زیادی طول بکشد. دوم اینکه خیلی موثر نیست. از این گذشته، اشیا می توانند به یکدیگر اشاره کنند! اطلاعات بیشتر در مورد زباله جمع کن - 2شکل مثالی را نشان می دهد که در آن 3 شی به یکدیگر اشاره دارند، اما هیچ کس دیگری به آنها اشاره نمی کند. به عبارت دیگر، بقیه برنامه به آنها نیاز ندارد. اگر زباله جمع کن به سادگی مراجع را شمارش می کرد، این 3 شی جمع آوری نمی شد و حافظه آزاد نمی شد (اشاره هایی به آنها وجود دارد!). ما می توانیم این را با یک فضاپیما مقایسه کنیم. در طول پرواز، فضانوردان تصمیم می گیرند لیست قطعات یدکی موجود برای تعمیر را بررسی کنند. از جمله اینکه از یک ماشین معمولی فرمان و پدال پیدا می کنند. بدیهی است که آنها در اینجا مورد نیاز نیستند و بی جهت فضا را اشغال می کنند (البته این دو قسمت به یکدیگر مرتبط هستند و عملکردهایی دارند). اما در داخل فضاپیما، آنها زباله های بی مصرفی هستند که باید دور ریخته شوند. بر این اساس، در جاوا، تصمیم به جمع آوری زباله ها نه بر اساس شمارش مرجع، بلکه بر اساس جداسازی اشیاء به دو نوع گرفته شد: قابل دسترس و غیرقابل دسترسی .. چگونه تشخیص دهیم که یک شی قابل دسترسی است؟ این همه به سادگی مبتکرانه است. یک شی قابل دسترسی است اگر توسط یک شی قابل دسترسی دیگر به آن ارجاع داده شود. بنابراین، ما یک "زنجیره دسترسی" دریافت می کنیم. با شروع برنامه شروع می شود و در طول مدت برنامه ادامه می یابد. چیزی شبیه به این است: اطلاعات بیشتر در مورد زباله جمع کن - 3 فلش در شکل کد اجرایی برنامه ما را نشان می دهد. کد (مثلاً main()متد) ارجاعاتی به اشیا ایجاد می کند. این اشیاء می توانند به اشیاء دیگر، آن اشیا به دیگران و غیره اشاره کنند. این یک زنجیره مرجع را تشکیل می دهد . اگر بتوانید از یک شی تا «مرجع ریشه» (که مستقیماً در کد اجرایی ایجاد شده است)، زنجیره را دنبال کنید، آنگاه قابل دسترسی در نظر گرفته می شود. چنین اشیایی در تصویر مشکی مشخص شده اند. اما اگر شی از این زنجیره خارج شود، یعنی هیچ یک از متغیرهای کد در حال اجرا به آن ارجاع ندهند، یک شی غیرقابل دسترس است و از طریق "زنجیره مرجع" نمی توان به آن دسترسی پیدا کرد. در برنامه ما، دو مورد از این قبیل با رنگ قرمز مشخص شده اند. توجه داشته باشید که این اشیاء "قرمز" به یکدیگر ارجاع دارند. اما همانطور که قبلاً گفتیم، زباله جمع‌آور مدرن جاوا مراجع را به حساب نمی‌آورد. تعیین می کند که آیا یک شی قابل دسترس یا غیرقابل دسترس است . در نتیجه، دو جسم قرمز رنگ در شکل را می گیرد. حالا بیایید کل فرآیند را از ابتدا تا انتها بررسی کنیم. با انجام این کار، ما همچنین خواهیم دید که چگونه حافظه در جاوا چیده شده است :) تمام اشیاء جاوا در ناحیه خاصی از حافظه به نام heap ذخیره می شوند . در زبان روزمره، یک پشته معمولاً کوهی از اقلام است که در آن همه چیز در هم آمیخته است. اما این چیزی نیست که پشته در جاوا وجود دارد. ساختار آن بسیار منطقی و معقول است. در برخی موارد، برنامه نویسان جاوا دریافتند که تمام اشیاء آنها را می توان به دو نوع تقسیم کرد: اشیاء ساده و "اشیاء با عمر طولانی" . "اشیاء با عمر طولانی" اشیایی هستند که از دورهای زیادی از جمع آوری زباله جان سالم به در برده اند. آنها معمولاً تا پایان برنامه زندگی می کنند. در پایان، پشته کامل، جایی که همه اشیا در آن ذخیره می شوند، به چند قسمت تقسیم شد. قسمت اول یک نام زیبا دارد: eden(از کتاب مقدس "باغ عدن"). این نام مناسب است، زیرا این جایی است که اشیاء پس از ایجاد به پایان می رسند. این بخشی از حافظه است که وقتی از کلمه کلیدی new استفاده می کنیم، اشیاء جدید ایجاد می شود. ممکن است اشیاء زیادی ایجاد شود. وقتی فضای این منطقه تمام می شود، جمع آوری زباله "سریع" اولیه آغاز می شود. باید بگوییم که زباله جمع کن بسیار باهوش است. الگوریتمی را بر اساس اینکه توده زباله بیشتری دارد یا اجسام زنده بیشتری انتخاب می کند. اگر تقریباً همه اشیاء زباله باشند، جمع کننده اشیاء زنده را علامت گذاری می کند و آنها را به ناحیه دیگری از حافظه منتقل می کند. سپس منطقه فعلی به طور کامل پاک می شود. اگر زباله زیاد نباشد و انبوه آن بیشتر اجسام زنده باشد، جمع‌آور زباله‌ها را علامت‌گذاری می‌کند، آن‌ها را پاک می‌کند و سایر اشیاء را با هم جمع می‌کند. گفتیم "گردآورنده اشیاء زنده را علامت گذاری می کند و آنها را به ناحیه دیگری از حافظه منتقل می کند" اما کجا؟ فضایی از حافظه که در آن همه اشیایی که حداقل یک دور از جمع آوری زباله باقی مانده اند جابجا می شوند، فضای بقا نامیده می شود . یک فضای بقا به نوبه خود به نسل ها تقسیم می شود . هر شی به یک نسل خاص تعلق دارد، بسته به اینکه چند دور از جمع آوری زباله باقی مانده است. اگر یک شی از یک دور جمع‌آوری زباله جان سالم به در برده باشد، در «نسل 1» قرار دارد. اگر 5، سپس "نسل 5". عدن و فضای بقا با هم منطقه ای به نام نسل جوان را تشکیل می دهند . علاوه بر نسل جوان، پشته دارای حافظه دیگری به نام نسل قدیم است . این دقیقاً همان منطقه ای است که اشیاء با عمر طولانی که از دورهای زیادی از جمع آوری زباله جان سالم به در برده اند به پایان می رسند. جدا نگه داشتن آنها از بقیه مزایایی دارد. جمع آوری کامل زباله تنها زمانی انجام می شود که نسل قدیم پر شده باشد، یعنی آنقدر اشیاء با عمر طولانی در برنامه وجود داشته باشد که حافظه کافی وجود ندارد. این فرآیند شامل بیش از یک ناحیه از حافظه است. به طور کلی، تمام اشیاء ایجاد شده توسط ماشین جاوا را شامل می شود. طبیعی است که این کار زمان و منابع بیشتری را می طلبد. این دقیقاً تصمیمی است که برای ذخیره اشیاء با عمر طولانی به طور جداگانه گرفته شده است. "جمع آوری سریع زباله" زمانی انجام می شود که فضاهای دیگر تمام شود. این فقط یک منطقه را شامل می شود، که آن را سریعتر و کارآمدتر می کند. در نهایت، هنگامی که حتی فضای اشیاء با عمر طولانی به طور کامل پر می شود، جمع آوری کامل زباله آغاز می شود. بنابراین، جمع کننده تنها زمانی از "سنگین ترین" ابزار استفاده می کند که اجتناب از آن غیرممکن باشد. در اینجا یک نمایش بصری از ساختار پشته و جمع آوری زباله است: اطلاعات بیشتر در مورد زباله جمع کن - 4
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION