JavaRush /وبلاگ جاوا /Random-FA /اطلاعات بیشتر در مورد زباله جمع کن در جاوا

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

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