Java'da çöp toplamanın ne olduğunu hatırlayın
Çöp toplama, kullanılmayan nesneleri yok ederek tam çalışma zamanı belleğini geri kazanma işlemidir.
Bazen programcı gereksiz nesneleri yok etmeyi unutabilir ve bunlara ayrılan bellek boşaltılmaz. Giderek daha fazla sistem belleği tüketilir ve sonunda daha fazla tahsis edilmez. Bu tür uygulamalar "bellek sızıntılarından" muzdariptir.
Belirli bir noktadan sonra, yeni nesneler oluşturmak için yeterli bellek kalmaz ve OutOfMemoryError nedeniyle program anormal bir şekilde sonlandırılır .
![](https://cdn.codegym.cc/images/article/3000851c-d7b0-48c1-a1b0-42fc199942d5/800.jpeg)
Java'da çöp toplama, Java programlarının belleği otomatik olarak yönetme işlemidir. Java programları, Java Virtual Machine (JVM) üzerinde çalışan bayt kodunda derlenir.
Java programları JVM'de çalıştığında, nesneler, kendilerine ayrılan bellek bölümü olan öbek üzerinde oluşturulur.
Bir Java uygulaması çalışırken içinde yeni nesneler oluşturulur. Sonunda, bazı nesnelere artık ihtiyaç yoktur. Herhangi bir zamanda yığın belleğin iki tür nesneden oluştuğunu söyleyebiliriz.
- Canlı - Bu nesneler kullanılıyor, başka bir yerden referans alıyorlar.
- Ölü - bu nesneler başka hiçbir yerde kullanılmaz, bunlara referans yoktur.
Çöp toplayıcı bu kullanılmayan nesneleri bulur ve belleği boşaltmak için kaldırır.
Java'da çöp toplama otomatik bir işlemdir . Programcının silinecek nesneleri açıkça işaretlemesine gerek yoktur.
Her JVM, kendi çöp toplama sürümünü uygulayabilir. Ancak toplayıcı, erişilemeyen nesneleri işaretlemek veya tanımlamak ve bunları sıkıştırma yoluyla yok etmek için yığın belleğinde bulunan nesnelerle ilgilenmek için standart JVM belirtimine uymalıdır.
Nesne Ulaşılabilirliği
Bir nesneyi canlı olarak tanımak için bağlantıların varlığı yeterli değildir. Bunun nedeni, bazı ölü nesnelerin diğer ölü nesnelere atıfta bulunabilmesidir. Bu nedenle, bir nesneye yapılan tüm göndermeler arasında en az birinin "canlı" bir nesneden olması gerekir.
![Nesne Ulaşılabilirliği](https://cdn.codegym.cc/images/article/eb12b7bc-7401-440e-a551-9b4461ba3b5d/800.jpeg)
Çöp toplayıcılar , canlı ve ölü nesneleri birbirinden ayırmak için GC Kökleri ( çöp toplama kökleri ) kavramıyla çalışırlar . %100 canlı nesneler var ve bunlardan diğer nesneleri canlandıran bağlantılar vb.
Bu tür köklere örnekler:
- Sistem sınıfı yükleyicisi tarafından yüklenen sınıflar.
- Canlı yayınlar.
- Yürütülen yöntemlerin ve yerel değişkenlerin parametreleri.
- Senkronizasyon için monitör olarak kullanılan nesneler.
- Bir amaç için çöp toplama işleminden tutulan nesneler.
- Çöp toplayıcı, bu köklerden başlayarak ve diğer nesnelere yapılan referansları izleyerek, bellekteki nesnelerin tüm grafiğinde yürür.
Java'da çöp toplama adımları
Standart çöp toplama uygulamasının üç adımı vardır.
1. Nesneleri canlı olarak işaretleyin
Bu noktada, çöp toplayıcı (GC), nesne grafiğini kat ederek bellekteki tüm canlı nesneleri tanımlamalıdır.
Bir nesneyi ziyaret ettiğinde, onu uygun ve dolayısıyla canlı olarak işaretler. GC köklerinden erişilemeyen tüm nesneler, çöp toplama için aday olarak kabul edilir.
![](https://cdn.codegym.cc/images/article/483e8406-ce8f-458a-8217-c6c2e2c70b2c/800.jpeg)
2. Ölü nesnelerin temizlenmesi
İşaretleme aşamasından sonra, bellek alanı canlı (ziyaret edilen) veya ölü (ziyaret edilmeyen) nesneler tarafından işgal edilir. Temizleme aşaması, bu ölü nesneleri içeren bellek parçalarını serbest bırakır.
![](https://cdn.codegym.cc/images/article/f10e166d-d9bf-462d-9d65-2c81df1b3457/800.jpeg)
3. Bellekte kalan nesnelerin kompakt düzeni
Bir önceki aşamada kaldırılan ölü nesnelerin yan yana olması gerekli değildir. Böylece, parçalanmış (yarı boş) bir bellek alanı alma riskiyle karşı karşıya kalırsınız.
Ancak, elbette, bunu sağladıktan sonra, çöp toplayıcının ölü nesneleri çıkardığı anda belleği sıkıştırmak mümkündür. Gerisi, yığının başında bitişik bir blokta yer alacaktır.
Sıkıştırma işlemi, yeni nesneler için sıralı olarak bellek ayırmayı kolaylaştırır.
![](https://cdn.codegym.cc/images/article/7008ce12-e886-44e5-8812-8431b4f7c741/800.jpeg)