SORU
20 Kasım 2008, PERŞEMBE


Son Java değişkenleri kullanarak çöp toplama geliştirir mi?

Bugün arkadaşlarıma ve bana çöp toplama geliştirmek için Java final anahtar kullanımı ile ilgili bir tartışma var.

Eğer yazarsanız, örneğin, bir yöntem gibi:

public Double doCalc(final Double value)
{
   final Double maxWeight = 1000.0;
   final Double totalWeight = maxWeight * value;
   return totalWeight;  
}

Yöntemi değişken bildirimi final çöp toplama yöntemi çıkar sonra yöntemi kullanılmayan değişkenleri bellekten temizlemek için yardımcı olacaktır.

Bu doğru mu?

CEVAP
20 Kasım 2008, PERŞEMBE


Burada biraz daha farklı bir örnek, referans tipi alanları yerine, son değer türü yerel değişkenler final ile: bir

public class MyClass {

   public final MyOtherObject obj;

}

Her zaman Sınıfım bir örneğini oluşturun, MyOtherObject bir örneğine giden bir referans oluşturmak olacak, ve GC bu bağlantıyı canlı nesneleri aramak için takip etmek zorunda kalacak.

JVM GC tüm canlı refereces incelemek için hangi işaretle-süpür GC algoritması kullanır "kök" konumları geçerli aramayı tüm nesneler yığını gibi. Her canlı nesne "" hayatta olmak, ve herhangi bir nesne, canlı bir nesne tarafından başvurulan da canlı olarak işaretlenmiş olarak işaretlenmiş.

Mark aşamasından sonra, GC yığını ile, tüm sivil nesneleri (ve diğer canlı nesneler için bellek sıkıştırma) için bellek boşaltma süpürür.

Ayrıca, önemli Java yığın bellek bölünmüş durumda kabul etmek gerekir ki "" ve bir "eski nesil". genç nesil Tüm nesneler başlangıçta genç nesil ayrılır (bazen olarak anılacaktır "kreş"). Nesnelerin çoğu kısa ömürlü olduğundan, GC genç nesil yeni çöp boşaltma konusunda daha agresif. Eğer bir nesnenin genç nesil toplama döngüsü hayatta kalırsa, eski nesil taşındı alır (bazen olarak anılacaktır daha az sıklıkla işlenir. "sözleşmeli nesil"),

Yani, benim biraz kafam karisti, söyleyeceğim "Hayır, bu 'son' modifer GC onun iş yükünü azaltmak değil".

Benim görüşüme göre, Java bellek yönetimi optimize etmek için en iyi strateji sahte başvurular mümkün olduğunca çabuk ortadan kaldırmaktır. "Başvuru yapmış olduğunuz an nesne için kullanma. "null atayarak yapabilirsin

Ya da, daha iyisi, her bir beyanname kapsamı boyutunu en aza indirmek. Örneğin, eğer bildirmek için bir nesne başına 1000 satırı yöntemi, ve eğer nesne hayatta kalacak kadar yakın, bu yöntemin kapsamı (son kapama küme ayracı), sonra nesneyi olabilir hayatta kalmak için çok daha uzun aslında gerekli.

Eğer kullandığınız küçük yöntemleri ile sadece bir düzine kadar kod satırlarını, nesneler ilan edilen bu yöntem düşmesinden kapsamı daha hızlı ve GC yapmak mümkün olacak çoğu kendi iş içinde çok daha verimli genç nesil. Nesneleri çok gerekli olmadıkça eski nesil taşınmasını istemiyorum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Howard Pinsky

    Howard Pinsk

    6 AĞUSTOS 2006
  • Sorikan

    Sorikan

    3 ŞUBAT 2008
  • UsherVEVO

    UsherVEVO

    15 EKİM 2009