Java Garbage Collection Part2

Kerim Fırat
4 min readJul 26, 2021

Java Garbage Collection Part1 makalesine buradan ulaşabilirsiniz.

Çöp Toplama Süreci

Makale serisinin ilk(Part1) bölümünde “Generations GC” başlığında “bellek alanları farklı jenerasyonlara(nesillere) bölünür” demiştik.
Dolayısıyla “Generations” ve buna bağlı olarak heap bölünmelerini detaylandırmıştık.Artık heap’in neden farklı nesillere bölündüğünü/ayrıldığını anladığımıza göre,bu bölünmüş alanların tam olarak nasıl etkileşime girdiğini inceleyebiliriz.Aşağıda,JVM’deki nesne tahsisi ve nesnelerin yaşlandırma sürecini gösteren bir dizi resimlere yer verilmiştir.
Bunları sırasıyla inceleyelim.

NOT: Resimlerde “Sarı” renk “Kullanılmayan/Başvurulmayan” nesneleri,”Mavi” renk ise “Kullanılan/Başvurulan” nesneleri temsil eder. Ayrıca “S0” ve “S1” alanlarında yer alan nesnelerin sahip oldukları “yaş” değerleri ilgili nesne üzerinde belirtilmiştir.

  1. İlk olarak,herhangi bir yeni nesne “Eden” alanında tahsis edilir.Bu süreçte her iki S0 ve S1(survivor/kurtulan,hayatta kalan) alanlar boş olarak başlatılır.
oracle.com

2.”Eden” alanı dolduğunda,Minor GC(çöp toplama) işlemi başlatılır.

oracle.com

3.Devreye giren Minor GC işlemi,sırasıyla iki işlem gerçekleştirir.
İlk işlemde referansı bulunan,yani başvurulan/kullanılan nesneleri S0(ilk kurtulan alan)’e taşır.İkinci işlemde ise “Eden” alanında referansı bulunmayan,yani başvurulmayan/kullanılmayan nesneleri siler. Tüm bu gerçekleşen işlemlere “Eden alanını temizleme” olarak adlandırılır.

oracle.com

4.Bir sonraki Minor GC işleminde aynı şey “Eden” alanı için tekrarlanır.Ve devamında yine başvurulmayan/kullanılmayan nesneler silinir ve başvurulan/kullanılan nesneler S0 ve S1 alanına taşınır.

NOT: “S1” alanı “S0” alanından daha eski nesneleri barındırır.
Nesne yaşlandırma süreci “Eden -> S0 -> S1” olarak ilerler. Veya direkt olarak Eden -> S1 olarak da ilerleyebilir.Bunun sebebi,”Eden” alanında uzun kalan nesneler,yani S0 için daha yaşlı-eski olan nesneler direkt olarak S1 alanına taşınır.Ancak etkin bellek yönetim amaçlı bazı durumlarda “Eden” ve “S1” alanı tamamen temizlemesi gerekir. Bu durumda S1 -> S0 olarak yaşlandırma ve taşıma işlemi yapılır.

Bu adımda Minor GC devreye girdiğinde tüm nesnelerin yaşları arttırılır.Yani nesneler yaşlandırılır. Dolayısıyla nesne taşıma “Eden->S0”’a taşınır,ve “S0->S1”’e taşınır. Aynı zamanda yukarıdaki not’da belirttiğim gibi,yaşlandırma sürecinde “Eden”’de bulunan nesnelerin yaşı “S1”’e müsait hale gelen nesneler “S0”’a uğramadan direkt olarak “S1”’e taşınır.Tüm bu taşıma işlemlerin sonucunda hem “Eden” alanı hem de “S0” alanı temizlenir.

oracle.com

5.Bir sonraki Minor GC’de aynı işlem tekrarlanır.Ancak bu sefer “hayatta kalan(S0,S1)” alanları kendi aralarında değişir.Dolayısıyla daha etkin bir temizlik ve bellek yönetimi için kullanılan/başvurulan nesneler “S0” alanına taşınır.Hayatta kalan nesneler yaşlandırılır,”Eden” ve “S1” temizlenir. Verilen görselde de görüldüğü gibi S1 alanında hayatta kalan tüm nesneler S0 alanına taşınıyor.

oracle.com

6.Bu görselde “Promotion”,yani “Terfi” gösteriliyor.Minor GC’den sonra,yaşlı nesneler belirli bir yaş eşiğine ulaştıklarında(bu örnekte 8),genç nesilden eski-yaşlı nesile yükseltilirler.Görselde görüldüğü gibi S1 alanında yer alan “8” yaş seviyesine ait nesneler “9” olarak yaşlandırılıyor ve “kadrolu” alana “terfi” dediğimiz durum gerçekleşiyor.Aynı zamanda “Eden” ve “S1” alanını tümüyle temizlemek için “S0” alanına gerekli taşımalar yapılıyor.

oracle.com

7.Minor GC’ler oluşmaya devam ettikçe,nesneler eski nesil(old generation) alana terfi etmeye devam edecekler.Terfi işlemini gösteren görsele bu adımda yer verilmiştir. Verilen görselde “Terfi” işlemi sırasıyla: 1.adım “Allocation(Tahsis)” yapılıyor,2.adım “Young Generation(Genç nesil)” alanına taşınıyor,3.adım “Old(Yaşlı-Eski nesil)” alanına taşınarak devam ediyor.

oracle.com

8.Minor GC,”Young Generation(Genç nesil)” ile olan tüm süreci hemen hemen kapsıyor.En son Major GC işlemi “Old Generation(Yaşlı-Eski nesil)” üzerinde temizleme ve sıkıştırma işlemi gerçekleştirecek.

Dolayısıyla Minor GC işlemi “Young Generation” üzerinde yaşlandırma,taşıma ve temizleme işlemi yaparken,Major GC ise “Old Generation” üzerinde nihai işlem olan temizleme ve sıkıştırma işlemi gerçekleştirir.Nesneler temizlendikten sonra,nesnelere ait bellek alanlarının art arda dizilmesi,yani sıkıştırılması gereklidir.Böylelikle yeni tahsis sürecinde belleğin tekrar kullanılabilir halde olması önemlidir.Aksi halde tüm bellek tükenir.

KAYNAKLAR:
https://www.oracle.com
https://openjdk.java.net/

-end of

--

--

Kerim Fırat
Kerim Fırat

Written by Kerim Fırat

Senior Android Platform(AOSP,AAOS) Architect,Open Source Contributor | Turkey Java User Group Vice Chairman | Author

No responses yet