İşte biraz farklı bir örnek, son değer türü yerel değişkenler yerine son başvuru türü alanları olan bir örnek:
public class MyClass {
public final MyOtherObject obj;
}
MyClass'ın bir örneğini her oluşturduğunuzda, bir MyOtherObject örneğine giden bir referans oluşturacaksınız ve GC canlı nesneleri aramak için bu bağlantıyı takip etmek zorunda kalacak.
JVM, GC "kök" konumlarındaki tüm canlı referansları (mevcut çağrı yığınındaki tüm nesneler gibi) incelemek zorunda olan bir mark süpürme GC algoritması kullanır. Her canlı nesne, canlı olarak "işaretlenir" ve canlı bir nesne tarafından atıfta bulunulan herhangi bir nesne de canlı olarak işaretlenir.
İşaretleme aşamasının tamamlanmasından sonra, GC, tüm işaretlenmemiş nesneler için belleği serbest bırakarak (ve kalan canlı nesneler için belleği sıkıştırarak) yığın içinde gezinir.
Ayrıca, Java yığın belleğinin "genç nesil" ve "eski nesil" olarak bölündüğünü bilmek önemlidir. Tüm nesneler başlangıçta genç nesilde tahsis edilir (bazen "kreş" olarak anılır). Çoğu nesne kısa ömürlü olduğundan, GC, genç nesilden yeni çöpleri kurtarmak konusunda daha agresiftir. Bir nesne genç neslin bir toplama döngüsünde hayatta kalırsa, daha az sıklıkta işlenen eski nesle (bazen "görevli nesil" olarak anılır) taşınır.
Öyleyse, aklımın ucunda, "hayır, 'son' değiştirici, GC'nin iş yükünü azaltmasına yardımcı olmuyor" diyeceğim.
Bana göre, Java'da bellek yönetiminizi optimize etmek için en iyi strateji, sahte referansları olabildiğince çabuk ortadan kaldırmaktır. Bunu, kullanmayı bitirir bitirmez bir nesne referansına "null" atayarak yapabilirsiniz.
Ya da daha iyisi, her bildirim kapsamının boyutunu en aza indirin. Örneğin, 1000 satırlık bir yöntemin başlangıcında bir nesne bildirirseniz ve nesne bu yöntemin kapsamının (son kapanış küme ayracı) kapanmasına kadar hayatta kalırsa, nesne gerçekte olduğundan çok daha uzun süre canlı kalabilir. gerekli.
Yalnızca bir düzine kadar kod satırı içeren küçük yöntemler kullanırsanız, bu yöntem içinde bildirilen nesneler daha hızlı kapsam dışına çıkacak ve GC işinin çoğunu çok daha verimli bir şekilde yapabilecektir. genç nesil. Kesinlikle gerekmedikçe nesnelerin eski nesle taşınmasını istemezsiniz.