Java Sanal Makinesi - Çöp Toplama
Bir Java nesnesinin yaşam döngüsü JVM tarafından yönetilir. Programcı tarafından bir nesne oluşturulduktan sonra, yaşam döngüsünün geri kalanı için endişelenmemize gerek yoktur. JVM, artık kullanılmayan nesneleri otomatik olarak bulacak ve hafızalarını yığından geri kazanacaktır.
Çöp toplama, JVM'nin yaptığı önemli bir işlemdir ve bunu ihtiyaçlarımıza göre ayarlamak, uygulamamıza büyük bir performans artışı sağlayabilir. Modern JVM'ler tarafından sağlanan çeşitli çöp toplama algoritmaları vardır. Hangi algoritmanın kullanılacağına karar vermek için uygulamamızın ihtiyaçlarının farkında olmamız gerekir.
C ve C ++ gibi GC olmayan dillerde yapabildiğiniz gibi Java'da bir nesneyi programlı olarak serbest bırakamazsınız. Bu nedenle, Java'da sarkan referanslara sahip olamazsınız. Bununla birlikte, boş referanslarınız olabilir (JVM'nin hiçbir zaman nesneleri depolamayacağı bir bellek alanına atıfta bulunan referanslar). Boş bir başvuru kullanıldığında, JVM bir NullPointerException oluşturur.
GC sayesinde Java programlarında bellek sızıntıları bulmak nadir olsa da, bunların meydana geldiğini unutmayın. Bu bölümün sonunda bir bellek sızıntısı yaratacağız.
Aşağıdaki GC'ler modern JVM'lerde kullanılmaktadır
- Seri toplayıcı
- Verim toplayıcı
- CMS toplayıcı
- G1 toplayıcı
Yukarıdaki algoritmaların her biri aynı görevi yerine getirir - artık kullanımda olmayan nesneleri bulmak ve yığın içinde kapladıkları belleği geri kazanmak. Buna naif yaklaşımlardan biri, her bir nesnenin sahip olduğu referansların sayısını saymak ve referans sayısı 0'a döner dönmez onu serbest bırakmak olacaktır (bu aynı zamanda referans sayımı olarak da bilinir). Bu neden saf? Dairesel bağlantılı bir liste düşünün. Düğümlerinin her birinin kendisine bir referansı olacaktır, ancak tüm nesneye herhangi bir yerden referansta bulunulmamaktadır ve ideal olarak serbest bırakılmalıdır.
JVM sadece belleği serbest bırakmakla kalmaz, aynı zamanda küçük bellek aynalarını daha büyük olanlarla birleştirir. Bu, bellek parçalanmasını önlemek için yapılır.
Basit bir not olarak, tipik bir GC algoritması aşağıdaki etkinlikleri gerçekleştirir -
- Kullanılmayan nesneleri bulma
- Yığın içinde işgal ettikleri hafızayı serbest bırakmak
- Parçaları birleştirme
GC, çalışırken uygulama iş parçacıklarını durdurmalıdır. Bunun nedeni, çalışırken nesneleri hareket ettirmesi ve bu nedenle bu nesnelerin kullanılamamasıdır. Bu tür duraklamalar 'dünyayı durdurma duraklamaları' olarak adlandırılır ve bu duraklamaların sıklığını ve süresini en aza indirmek, GC'mizi ayarlarken hedeflediğimiz şeydir.
Bellek Birleştirme
Bellek birleştirme işleminin basit bir gösterimi aşağıda gösterilmiştir
Gölgeli kısım, serbest bırakılması gereken nesnelerdir. Tüm alan geri alındıktan sonra bile, yalnızca maksimum boyut = 75Kb olan bir nesne tahsis edebiliriz. Bu, aşağıda gösterildiği gibi 200Kb boş alanımız olsa bile