JavaRush /Java Blogu /Random-AZ /Java-da zibil toplayıcı haqqında daha çox məlumat

Java-da zibil toplayıcı haqqında daha çox məlumat

Qrupda dərc edilmişdir
Salam! Keçən mühazirədə biz ilk olaraq Java dilinin daxili mexanizmi - zibil yığıcısı ilə tanış olduq. Proqramınız işləyərkən o, arxa planda işləyir, lazımsız hala gələn və sonra silinəcək obyektləri toplayır. Bu yolla o, gələcəkdə yeni obyektlər yaratmaq üçün yaddaşı boşaldır. Bu mühazirədə onun iş prinsipinə daha yaxından nəzər salacağıq. Məsələn, obyekt necə və hansı məqamda lazımsız olur? Bəs zibil yığan şəxs bunu haradan bilir? Bu suallara cavab verəcəyik :) Mühazirəmiz daha çox icmal xarakterlidir: bu materialı əzbərləmək lazım deyil. Yaddaş və zibil yığan işi ilə bağlı üfüqlərinizi genişləndirmək üçün nəzərdə tutulub, ona görə də onu oxumaq və özünüz üçün yeni bir şey öyrənmək kifayətdir :) Gəlin gedək! Yadda saxlamağınız lazım olan ilk şey, zibil toplayıcının proqramınızla paralel işləməsidir . O, onun bir hissəsi deyil və ayrıca fəaliyyət göstərir: bunu təsvir etmək üçün sonuncu mühazirədə biz robot tozsoranla bənzətmə etdik. Əslində bu həmişə belə olmayıb. Əvvəllər zibil toplayıcı elə qurulmuşdu ki, o, proqramınızla eyni mövzuda işləyirdi. Və bəzi cədvələ görə, bir neçə dəqiqədən bir proqramda lazımsız obyektlərin olub-olmadığını yoxlamağa başladı. Problem onda idi ki, bu yoxlama və zibil yığımı zamanı proqram dondu və icra olunmadı. Təsəvvür edin ki, ofisdə oturub işləyirsiniz. Amma sonra təmizlikçi xanım gəlir və otaqda döşəmələri yumaq lazımdır. O, sizi 5 dəqiqəyə kompüterin arxasından qovur və siz onun təmizlənməsini bitirənə qədər gözləyin. Bu müddət ərzində işləyə bilməzsiniz. Əvvəllər təxminən belə işləyirdi zibil yığanlar :) Sonradan bu mexanizm dəyişdirildi və indi zibil yığan proqramın özünün işini ləngitmədən arxa planda işləyir. Artıq bilirsiniz ki, bir obyekt ona istinad qalmadıqda ölür. Lakin zibil toplayıcı faktiki olaraq istinadları saymır . Birincisi, olduqca uzun ola bilər. İkincisi, çox təsirli deyil. Axı, obyektlər bir-birinə istinad edə bilər! Zibil kollektoru haqqında daha çox - 2Şəkildə 3 obyektin bir-birinə istinad etdiyi, lakin heç kimin onlara istinad etmədiyi nümunə göstərilir. Yəni proqramın qalan hissəsinin işləməsi üçün onlar lazım deyil. Əgər zibil yığan sadəcə arayışları saysaydı, bütün bu 3 obyekt qalardı və yaddaşı boşaltmazdı: onlara istinadlar var! Onu kosmik gəmi ilə müqayisə etmək olar. Uçuş zamanı astronavtlar təmir üçün ehtiyat hissələrinin siyahısını yoxlamaq qərarına gəliblər və onların arasında adi avtomobildən sükan və pedallar tapıblar. Onlar burada açıq şəkildə lazım deyil və əlavə yer tuturlar. Baxmayaraq ki, bu hissələr bir-birinə bağlıdır və bəzi funksiyaları var, kosmik gəminin istismarı çərçivəsində onlar lazımsız zibildir, bundan xilas olmaq daha yaxşıdır. Buna görə də, Java zibil toplanması üçün istinadları saymaqla deyil, obyektləri iki növə - əlçatanəlçatmaz olana bölmək qərarına gəldi.. Bir obyektin əlçatan olub olmadığını necə müəyyən etmək olar? Dahi hər şey sadədir. Obyektə başqa əlçatan obyekt tərəfindən istinad edilirsə, əlçatandır. Bu, "əlçatanlıq zənciri" ilə nəticələnir. Proqram başlayanda başlayır və bütün fəaliyyət müddəti ərzində davam edir. Bu belə görünür: Zibil kollektoru haqqında daha çox - 4Şəkildəki ox proqramımızın icra kodunu göstərir. Kodda, məsələn, main() metodunda obyektlərə istinadlar yaradılır. Bu obyektlər yeni obyektlərə, bəziləri daha çox obyektlərə və s. Obyekt bağlantıları zənciri əmələ gəlir . Əgər obyektə bu keçidlər zənciri vasitəsilə “kök link”ə, yəni birbaşa icraçı kodda yaradılmış obyektə çatmaq olarsa, o, əlçatan sayılır. Şəkilimizdə onlar mavi rənglə göstərilmişdir. Amma əgər obyekt bu zəncirdən çıxıbsa, yəni hazırda icra olunan koddakı dəyişənlərin heç birində ona istinad yoxdursa və “bağlantılar zənciri” ilə də ona çatmaq mümkün deyilsə – əlçatmaz sayılır. Proqramımızda iki belə obyekt qırmızı rənglə göstərilmişdir. Diqqət edin: bu "qırmızı" obyektlərin bir-biri ilə əlaqəsi var. Ancaq əvvəllər dediyimiz kimi, Java-da müasir zibil toplayıcısı istinad hesablamasını həyata keçirmir. O, obyektin əlçatan və ya əlçatmaz olduğunu müəyyən edir . Buna görə şəkildəki iki qırmızı obyekt onun şikarına çevriləcək. İndi gəlin başdan sona qədər bütün prosesə baxaq və eyni zamanda Java-da yaddaşın necə işlədiyini görək :) Java-da bütün obyektlər heap adlanan xüsusi yaddaş sahəsində saxlanılır . Adi dillə desək, “yığın” hər şeyin qarmaqarışıq vəziyyətdə olduğu cisimlər dağıdır. Ancaq Java-dakı yığın belə deyil. Çox məntiqli və ağlabatan bir quruluşa malikdir. Gözəl bir gün Java proqramçıları proqramlarındakı bütün obyektlərin iki növə bölünə biləcəyini kəşf etdilər - nisbətən danışan, sadə obyektlər"uzun ömürlü" obyektlər . “Uzun ömürlü” obyektlər bir çox zibil kolleksiyalarından sağ qalmış obyektlərdir. Çox vaxt onlar proqramın sonuna qədər mövcud olacaqlar. Nəticədə, bütün yaradılmış obyektlərin saxlandığı ümumi yığın bir neçə hissəyə bölündü. Birinci hissənin gözəl adı var - Eden (biblical "Eden bağı"). Bu, əla addır, çünki bu, obyektlərin yaradıldıqdan sonra getdiyi yerdir. Məhz bu hissədə biz yazarkən yaddaş yeni obyektlər üçün ayrılırnew. Bir çox obyekt yaradıla bilər və bu sahədə yer bitdikdə ilk, “sürətli” zibil yığımı başlayır. Demək lazımdır ki, zibil yığan çox ağıllıdır və yığında daha çox olandan - zibildən və ya işləyən obyektlərdən asılı olaraq iş alqoritmi seçir. Demək olar ki, bütün obyektlər zibildirsə, kollektor "canlı" obyektləri qeyd edir və onları başqa bir yaddaş sahəsinə köçürür, bundan sonra cari sahə tamamilə təmizlənir. Əgər zibil azdırsa və onun çox hissəsini canlı obyektlər tutursa, zibilləri işarələyir, təmizləyir, qalan obyektləri sıralayır. Dedik ki, “kollektor “canlı” obyektləri qeyd edir və onları başqa yaddaş yerinə köçürür, bəs hansı? Ən azı bir zibil kolleksiyasından sağ qalan bütün obyektlərin köçürüldüyü yaddaş sahəsi Survival Space adlanır . Survival Space, öz növbəsində, nəsillərə bölünür . Hər bir obyektə nə qədər zibil kolleksiyası yaşadığına görə bir nəsil təyin edilir. Əgər varsa, o, “1-ci nəsil”, 5-dirsə, “5-ci nəsil”ə aiddir. Eden və Survival Space birlikdə Gənc Nəsil adlı bir sahə yaradır . Gənc Nəsildən əlavə yığında daha bir yaddaş sahəsi var - Köhnə Nəsil (“köhnə nəsil”). Bunlar çoxlu zibil kolleksiyalarından sağ qalmış çox uzunömürlü obyektlərdir. Onları digərlərindən ayrı saxlamaq daha sərfəlidir. Və yalnız Köhnə Nəsil sahəsi dolu olduqda, yəni. Hətta proqramda o qədər uzunömürlü obyektlər var ki, yaddaş kifayət deyil, tam zibil yığılması həyata keçirilir. O, təkcə bir yaddaş sahəsini deyil, ümumiyyətlə Java maşınının yaratdığı bütün obyektləri emal edir. Təbii ki, bu, daha çox vaxt və vəsait tələb edir. Buna görə də uzunömürlü obyektlərin ayrıca saxlanması qərara alınıb. Digər ərazilərdə yer tükəndikdə “sürətli zibil yığımı” həyata keçirilir. Yalnız bir sahəni əhatə edir və bu səbəbdən daha qənaətcil və daha sürətli olur. Sonda, hətta yüzilliklər üçün ərazi artıq tıxandıqda, tam təmizlik mübarizəyə girir. Beləliklə, ən "ağır" alət montajçı tərəfindən yalnız lazım olmadıqda istifadə olunur. Sxematik olaraq, yığının və təmizləmənin quruluşu belə görünür: Zibil kollektoru haqqında daha çox - 5
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION