CodeGym /Java Blogu /Rastgele /Çöp toplayıcı hakkında daha fazla bilgi
John Squirrels
Seviye
San Francisco

Çöp toplayıcı hakkında daha fazla bilgi

grupta yayınlandı
MERHABA! Son derste, Java'nın yerleşik çöp toplayıcısını ilk kez tanıdık ve nasıl çalıştığı hakkında kabaca bir fikir edindik. Programınız çalışırken arka planda çalışır ve daha sonra silinecek gereksiz nesneleri toplar. Böylece, gelecekte yeni nesneler oluşturmak için kullanılabilecek belleği boşaltır.
Çöp toplayıcı hakkında daha fazlası - 1
Bu derste, nasıl çalıştığını daha ayrıntılı olarak tartışacağız. Örneğin, bir nesne nasıl ve ne zaman gereksiz hale gelir? Ve çöp toplayıcı nasıl öğrenir? Bunlar bugünkü derste cevaplayacağımız sorular :) Ders daha çok bir genel bakış gibi olacak: bu materyali ezberlemenize gerek yok. Amaç, temel olarak hafızanın ve çöp toplayıcının nasıl çalıştığına ilişkin vizyonunuzu genişletmektir, bu yüzden baştan sona okuyun ve kendiniz için yeni bir şeyler bulun :) Hadi gidelim! Hatırlamanız gereken ilk şey, çöp toplayıcının programınızla paralel çalıştığıdır.. Bu, programınızın bir parçası değildir. Ayrı çalışır (son derste bunu bir robot elektrik süpürgesine benzetmiştik) Ama her zaman böyle değildi. Çöp toplama, programınızla aynı iş parçacığında gerçekleştiriliyordu. Bazı programlarda (birkaç dakikada bir), çöp toplayıcı programda istenmeyen nesnelerin olup olmadığını kontrol ederdi. Sorun, programın bu kontrol ve çöp toplama sırasında askıda kalması (çalışmaması) idi. İş yerinde ofisinizde oturduğunuzu hayal edin. Ama sonra temizlikçi kadın yerleri yıkamak için gelir. Sizi 5 dakikalığına bilgisayarınızdan uzaklaştırıyor ve temizliği bitirmesini bekliyorsunuz. Bu süre zarfında çalışamazsınız. Eskiden çöp toplama böyle işliyordu :) Bu mekanizma daha sonra değiştirildi ve artık çöp toplayıcı arka planda çalışıyor, programın çalışmasını engellemez. Artık referansları olmayan bir nesnenin öldüğünü zaten biliyorsunuz. Gerçekte,çöp toplayıcı, nesne başvurularını saymaz . İlk olarak, bu uzun zaman alabilir. İkincisi, çok etkili değil. Sonuçta, nesneler birbirine atıfta bulunabilir! Çöp toplayıcı hakkında daha fazla bilgi - 2Şekil, 3 nesnenin birbirine atıfta bulunduğu, ancak başka hiç kimsenin onlara atıfta bulunmadığı bir örneği göstermektedir. Başka bir deyişle, programın geri kalanının bunlara ihtiyacı yoktur. Çöp toplayıcı basitçe referansları saysaydı, bu 3 nesne toplanmaz ve hafıza boşaltılmaz (onlara referanslar vardır!). Bunu bir uzay aracına benzetebiliriz. Uçuş sırasında astronotlar, onarım için mevcut yedek parça listesini kontrol etmeye karar verirler. Diğer şeylerin yanı sıra, sıradan bir arabadan bir direksiyon simidi ve pedallar bulurlar. Açıkçası, burada onlara ihtiyaç yok ve gereksiz yere yer kaplıyorlar (gerçi bu iki parça birbiriyle ilişkilidir ve bazı işlevleri vardır). Ancak uzay aracının içinde, atılması gereken işe yaramaz çöplerdir. Buna göre Java'da çöp toplama kararı referans sayımına göre değil,ulaşılabilir ve ulaşılamaz . Bir nesnenin ulaşılabilir olup olmadığını nasıl anlarız? Hepsi dahiyane. Bir nesneye, erişilebilir başka bir nesne tarafından başvuruluyorsa erişilebilir. Böylece bir "ulaşılabilirlik zinciri" elde ederiz. Program başladığında başlar ve program süresince devam eder. Şuna benzer: Çöp toplayıcı hakkında daha fazla bilgi - 3 Şekildeki ok, programımızın yürütülebilir kodunu gösterir. Kod (örneğin, main()yöntem) nesnelere referanslar oluşturur. Bu nesneler diğer nesnelere, bu nesneler diğerlerine vb. atıfta bulunabilir. Bu bir referans zinciri oluşturur. Bir nesneden "kök referansa" (doğrudan yürütülebilir kodda oluşturulan) kadar zincir boyunca izleyebilirseniz, erişilebilir olarak kabul edilir. Bu tür nesneler resimde siyah olarak işaretlenmiştir. Ancak, bir nesne bu zincirin dışına çıkarsa, yani şu anda yürütülmekte olan koddaki değişkenlerin hiçbiri ona referans vermiyorsa ve "referans zinciri" yoluyla ulaşılamazsa, bir nesneye ulaşılamaz. Programımızda bu tür iki nesne kırmızıyla işaretlenmiştir. Bu "kırmızı" nesnelerin birbirlerine göndermeleri olduğuna dikkat edin. Ancak daha önce de söylediğimiz gibi, Java'nın modern çöp toplayıcısı referansları saymaz. Bir nesnenin ulaşılabilir veya ulaşılamaz olup olmadığını belirler.. Sonuç olarak, şekildeki iki kırmızı nesneyi yakalayacaktır. Şimdi baştan sona tüm sürece bakalım. Bunu yaparken Java'da belleğin nasıl düzenlendiğini de görmüş olacağız :) Tüm Java nesneleri, heap adı verilen özel bir bellek alanında depolanır . Günlük dilde, bir yığın genellikle her şeyin birbirine karıştığı bir öğeler dağıdır. Ancak Java'daki öbek bu değil. Yapısı çok mantıklı ve makul. Bir noktada Java programcıları, tüm nesnelerinin iki türe ayrılabileceğini keşfettiler: basit nesneler ve "uzun ömürlü nesneler".. "Uzun ömürlü nesneler", birçok çöp toplama turundan sağ çıkmış nesnelerdir. Genellikle program bitene kadar yaşarlar. Sonunda, tüm nesnelerin depolandığı tam yığın birkaç parçaya bölündü. İlk bölümün güzel bir adı var: Eden(İncil'deki "Cennet Bahçesi" nden). Bu ad uygundur, çünkü nesneler oluşturulduktan sonra burada sona erer. Bu, yeni anahtar kelimeyi kullandığımızda yeni nesnelerin yaratıldığı hafızanın bir parçasıdır. Birçok nesne oluşturulabilir. Bu alanda yer kalmadığında, ilk "hızlı" çöp toplama işlemi başlar. Çöp toplayıcının çok zeki olduğunu söylemeliyiz. Yığında daha fazla çöp mü yoksa daha fazla canlı nesne mi olduğuna bağlı olarak bir algoritma seçer. Neredeyse tüm nesneler çöp ise, toplayıcı canlı nesneleri işaretler ve onları başka bir hafıza alanına taşır. Ardından mevcut alan tamamen temizlenir. Çok fazla çöp yoksa ve yığın çoğunlukla canlı nesnelerse, toplayıcı çöpü işaretler, temizler ve diğer nesneleri birlikte paketler. Dedik "bir hayatta kalma alanı . Hayatta kalma alanı ise nesillere bölünmüştür . Her nesne, hayatta kaldığı kaç tur çöp toplamaya bağlı olarak belirli bir nesle aittir. Bir nesne bir tur çöp toplama işleminden sağ çıktıysa, o zaman "1. Nesil"dedir; 5 ise, "5. Nesil". Eden ve bir hayatta kalma alanı birlikte, genç nesil adı verilen bir alan oluşturur . Genç kuşağa ek olarak, yığının eski kuşak adı verilen başka bir bellek alanı vardır.. Bu, tam olarak, birçok çöp toplama turundan sağ kurtulan uzun ömürlü nesnelerin sona erdiği alandır. Onları diğerlerinden ayrı tutmanın avantajları vardır. Tam çöp toplama, yalnızca eski nesil dolduğunda gerçekleştirilir, yani programda o kadar çok uzun ömürlü nesne vardır ki, yeterli bellek yoktur. Bu süreç birden fazla hafıza alanı içerir. Genel olarak, Java makinesi tarafından oluşturulan tüm nesneleri içerir. Doğal olarak, bu çok daha fazla zaman ve kaynak gerektirir. Uzun ömürlü nesneleri ayrı ayrı saklama kararı tam olarak budur. Diğer alanlarda yer kalmadığında "hızlı çöp toplama" gerçekleştirilir. Bu, onu daha hızlı ve daha verimli kılan yalnızca bir alanı içerir. Son olarak, uzun ömürlü nesnelerin alanı bile tamamen dolduğunda, tam çöp toplama tetiklenir. Bu nedenle, toplayıcı "en ağır" aleti yalnızca ondan kaçınmanın imkansız olduğu durumlarda kullanır. İşte yığın yapısının ve çöp toplamanın görsel bir temsili: Çöp toplayıcı hakkında daha fazla bilgi - 4
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION