Garbage Collection - What is G1 Garbage Collector?
[ answered ]

۱. معرفی شده در جاوا 7 ۲. پیشفرض در جاوا 9 ۳. موثر برای Heap های بزرگ ۴. انجام اکثر عملیات به صورت همزمان (Concurrent) - که مانع از متوقف کردن Application Thread میشود. ۵. قابلیت تعیین بیشینه زمان توقف (Maximum Pause Time)

**توضیح: منظور از “Minor GC” فرآیند جمع آوری یا همان Garbage Collection ای است که در قسمتی از فضای Heap اتفاق میوفتد و منظور از Major Garbage Collection همان Garbage Collection ای است که در کل فضای Heap شامل تمامی نسل ها اتفاق میوفتد.

در نسخه های پیشین فضای Heap به دو قسمت (نسل) “جوان” و “پیر” تقسیم میشود که نسل “جدید” خود به قسمت های “Eden و “Survivor” تقسیم میشود :

GC

با ساخت هر شی جدید فضایی به تناسب برای این شی در فضای Eden اختصاص داده میشود (Allocation).

با ساخت اشیا جدید به مرور زمان فضای Eden پر شده و در این زمان یک Minor GC اتفاق افتاده و هر شی که از اولین Minor GC زنده بماند وارد فضای Survivor میشود. در Minor GC بعدی که با پر شدن دوباره فضای Eden اتفاق میافتد اشیا زنده مانده از اولین و دومین Minor GC وارد فضای Survivor میشوند و این روند ادامه دارد تا زمانی که یک یا هرچند شی از تعداد زیادی Minor GC زنده بمانند که در این حالت این اشیا به قسمت “پیر” یا همان Old Generation منتقل میشوند.

با ادامه و تکرار فرآیندهای ذکر شده در بالا به نقطه ای خواهیم رسید که فضای “پیر” یا همان Old Generation نیز پر شده و در این زمان Major GC اتفاق میوفتد که تمام فضای Heap را از وجود اشیا بلااستفاده (Unused Objects) پاک کرده و فضای لازم برای ساخت شی جدید را در اختیار ما قرار میدهد.

لازم به ذکر است Major GC که در کل سطح Heap اتفاق میوفتد، نیازمند متوقف کردن (Pause) تمامی ترد های اپلیکیشن (Application Threads) میباشد که این اتفاق اصطلاحاً Stop The World نامیده میشود و چنین فرآیندی بسیار سنگین و هزینه بر است که بعضاً طولانی شدن زمان به انجام رسیدن آن حتی میتواند باعث از دست رفتن فریم های تصویر و کندی در اجرای برنامه شود!

روش کار و مزیت های G1 :

در G1 فضای Heap به صورت پیشفرض به قسمت (Region) های مساوی تقریباً ۲ مگابایتی تقسیم میشود و هر کدام از این فضاها قابلیت تبدیل به “Eden” یا “Survivor” و یا “Old Generation” را دارا می‌باشند: **حرف U مخفف کلمه ی Unassigned / حرف E مخفف Eden / حرف S مخفف Survivor / حرف O مخفف Old

GC1

این روش هوشمندانه ی تقسیم بندی فضا به G1 این قابلیت را میدهد تا در هر Minor GC گروه کوچکی از این فضاها را انتخاب کرده و سریعا کار خود را به انجام برساند و احتمال نیاز به Major GC در کل سطح Heap و تمامی نسل ها را به پایین ترین سطح میرساند، در نتیجه سیستم بار بسیار کمتری را متحمل شده و احتمال وقوع Stop The World بسیار کمتر از نسل های قبلی GC خواهد بود.

هنگامی که یک Region توسط G1 برای Minor GC انتخاب میشود تمامی اشیا زنده مانده آن Region به یک Region خالی (Unassigned) منتقل میشود.برای مثال اگر Region انتخاب شده از جنس Eden باشد، Region ای که اشیا زنده به آن منتقل میشوند از جنس Survivor خواهد بود و به همین ترتیب…

از دیگر مزیت های این روش تقسیم بندی فضا در G1 عملکرد بسیار موثرتر در مواجهه با Heap های بسیار بزرگ می باشد، چون مانند نسل های پیشین برای اختصاص فضا به شی (Allocation) وابسته به فضای متمادی (Continuous) نیست: در واقع تمامی Region های Unassigned قابلیت پذیرایی از شی جدید و تبدیل شدن به Eden Region را دارا میباشند. این روش تقسیم بندی فضا همچنین امکان Collection (جمع آوری زباله یا همان اشیا بلااستفاده) برای فضای “پیر” و “جوان” به صورت همزمان را فراهم میاورد.

نامگذاری : G1 به صورت Garbage First به معنای “اول زباله ها” یا به بیان بهتر “اولویت با زباله ها” میباشد که دلیل آن در شیوه عملکرد G1 نهفته است، به این صورت که هنگام وقوع Minor GC اولویت با Region هایی است که مقدار بیشتری Garbage درون آنها وجود داشته باشد.