Java yığın terminolojisi: genç, yaşlı ve kalıcı nesiller?


318

Ben genç kavramlarının ne olduğunu anlamaya çalışıyorumJava yığın terminolojisinde , yaşlı ve kalıcı kuşak ve daha spesifik olarak üç kuşak arasındaki etkileşimleri .

Sorularım:

  • Genç nesil nedir?
  • Eski nesil nedir?
  • Kalıcı nesil nedir?
  • Üç kuşak birbirleriyle nasıl etkileşir / ilişki kurar?

Sun JDK / OpenJDK hakkında konuştuğunuzu varsayarsak, Depolama Yönetimi hakkındaki OpenJDK web sitesindeki sayfaya bakın . Altta daha fazla bilgi için birkaç bağlantı var.
Nicholas Riley

1
Ayrıca bu soru ile ilgili "
tenured

Yanıtlar:


304

Bu yaygın bir yanlış anlama gibi görünüyor. Oracle'ın JVM'sinde, kalıcı nesil yığının bir parçası değildir. Sınıf tanımları ve ilgili veriler için ayrı bir alan. Java 6 ve daha önceki sürümlerde, kalıcı dizgede stajyer dizeleri de depolanmıştır. Java 7'de, interned dizeleri ana nesne yığınında saklanır.

İşte kalıcı nesil hakkında iyi bir yazı .

Oracle'ın JConsole kılavuzundaki her alan için verilen açıklamaları beğendim :

HotSpot Java VM için, seri çöp toplama için bellek havuzları aşağıdaki gibidir.

  • Eden Space (yığın): Belleğin başlangıçta çoğu nesne için ayrıldığı havuz.
  • Survivor Space (yığın): Eden alanının çöp koleksiyonundan kurtulan nesneler içeren havuz.
  • Kiralanmış Üretim (yığın): Hayatta kalan alanda bir süredir var olan nesneleri içeren havuz.
  • Kalıcı Nesil (yığın olmayan): Sınıf ve yöntem nesneleri gibi sanal makinenin tüm yansıtıcı verilerini içeren havuz. Sınıf veri paylaşımını kullanan Java VM'leriyle bu nesil salt okunur ve okuma-yazma alanlarına ayrılır.
  • Kod Önbelleği (yığınsız): HotSpot Java VM ayrıca yerel kodun derlenmesi ve depolanması için kullanılan belleği içeren bir kod önbelleği içerir.

Java, nesli çöp toplama kullanır. Bu, eğer bir nesne foo'nuz varsa (ki bu bir sınıfın örneğidir), ne kadar çok çöp toplama olayından kurtulursa (hala referanslar varsa), o kadar yükselir. Genç nesilde başlar (kendisi birden fazla alana bölünür - Eden ve Survivor) ve sonunda yeterince uzun süre hayatta kalsaydı, olgunlaşmış nesle sonuçlanır.


2
Java 7'den itibaren dizelerin artık kalıcı nesilde stajyer olmadığına inanıyorum.
Tim Goodman

Haklısın, bunun bir sözden çok önce hayatta kalmasına şaşırdım. Daha sonra Java 8'de kalıcı nesil metaspace ile değiştirilecek (varsayılan olarak sınırsız olmaktan başka ne kadar farklı olacağından emin olmasam da)
Joshua McKinnon

9
Joshua - "eski", "tenured" ile eşanlamlıdır ve "new", "survivor?"
joadha

1
perma geni yalnızca Java 8'den önce geçerlidir.
lwpro2

2
Hala bir cevap bekliyorsanız, evet haklısınız @joadha. Bu bağlantıya göz atın: codeahoy.com/2017/08/06/basics-of-java-garbage-collection
recepinanc

197

Öbek aşağıdaki gibi genç ve yaşlı nesillere ayrılmıştır:

Genç Nesil : Kısa süre yaşadığı ve iki mekana ayrıldığı yerdir:

  • Eden Space : Nesne bu alana tahsis edilen yeni anahtar kelime belleği kullanılarak oluşturulduğunda.
  • Survivor Space : Bu, Eden uzayından java çöp toplandıktan sonra hayatta kalan nesneleri içeren havuz.

Eski Nesil : Bu havuz temel olarak dayanıklı ve sanal (ayrılmış) alan içerir ve Genç Nesil'den çöp toplandıktan sonra hayatta kalan nesneleri tutacaktır.

  • Dayanaklı Boşluk: Bu bellek havuzu, birden çok çöp toplama işleminden sonra hayatta kalan nesneleri içerir.

Kalıcı Nesil: Ad olarak da adlandırılan bu bellek havuzu, kalıcı sınıf meta verileri ve tanımlayıcı bilgileri içerir, böylece PermGen alanı her zaman sınıflar için ayrılmıştır ve örneğin statik üyeler gibi sınıflara bağlı olanlar.

Java8 Güncellemesi: PermGen , Metaspace ile değiştirilir .
Temel fark, Metaspace'in dinamik olarak yeniden boyutlandırılmasıdır, yani çalışma zamanında genişleyebilir.
Java Metaspace alanı: sınırsız (varsayılan)

Kod Önbelleği (Sanal veya ayrılmış): HotSpot Java VM kullanıyorsanız, yerel kodun derlenmesi ve saklanması için kullanılacak belleği içeren kod önbellek alanını içerir.

resim açıklamasını buraya girin

Nezaket


@Premraj ne anlama geliyor Metaspace dinamik olarak yeniden boyutlandırma yani, Çalışma zamanında genişleyebilir. ? Varsayılan olarak sınır kadar olmayan tek fark?
gstackoverflow

1
mükemmel .. nerede yöntem alanı, nativestack ve çalışma zamanı sabit havuz bu resimde olduğunu biliyor olabilir? ve buna göre ne tutuyorlar?

yerel yöntem kodu için kod önbelleği kullanılırsa, yerel yöntem yığını (her iş parçacığında bir tane olacaktır) ne olur?

49

Genç nesil nedir?

Genç Nesil tüm yeni nesneleri tahsis ve yaşlı yerdir. Genç kuşak dolduğunda, bu küçük bir çöp toplanmasına neden olur. Ölü nesnelerle dolu genç bir nesil çok çabuk toplanıyor. Hayatta kalan bazı nesneler yaşlı ve sonunda eski kuşağa geçiyor.

Eski nesil nedir?

Eski Nesil uzun hayatta kalan nesneleri depolamak için kullanılır. Genellikle, genç nesil nesne için bir eşik ayarlanır ve bu yaş karşılandığında, nesne eski nesle taşınır. Sonunda eski kuşağın toplanması gerekiyor. Bu olaya büyük çöp toplama denir

Kalıcı nesil nedir?

Sürekli üretim meta uygulamada kullanılan sınıfları ve yöntemleri tarif etmek için JVM gerektirdiği içerir. Kalıcı nesil, uygulama tarafından kullanılan sınıflara dayanarak çalışma zamanında JVM tarafından doldurulur.

PermGen, Java 8 sürümünden bu yana Metaspace ile değiştirildi.

PermSize ve MaxPermSize parametreleri artık yok sayılacak

Üç kuşak birbirleriyle nasıl etkileşir / ilişki kurar?

resim açıklamasını buraya girin

Görüntü kaynağı ve Oracle Technetwork eğitim makalesi: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

" Genel Çöp Toplama Süreci yukarıdaki yazıda" Birçok diyagramlar ile aralarındaki etkileşimleri açıklar.

Özet şemasına bir göz atın:

resim açıklamasını buraya girin


mükemmel .. nerede yöntem alanı, nativestack ve çalışma zamanı sabit havuz bu resimde olduğunu biliyor olabilir? ve buna göre ne tutuyorlar?

daha fazla bilgi için docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html adresine bakın . Yöntem alanı sanal makine başlangıcında oluşturulur. Yöntem alanı mantıksal olarak yığının bir parçası olmasına rağmen, basit uygulamalar çöp toplamayı veya sıkıştırmamayı seçebilir. Her çalışma zamanı sabit havuzu, Java Sanal Makinesi'nin yöntem alanından ayrılır
Ravindra babu

u emin misiniz ... i permgen uzay parçası olduğunu okuyordum (hangi yığın değil)? journaldev.com/2856/…

Oracle belgeleri daha otantik
Ravindra babu

Zaman birimi (örn. Ms) cinsinden genç nesil nesne için eşik ayarlandı mı? veya GC mermileri?
Çok Amaçlı

16

Java sanal makinesi üç kuşakta düzenlenmiştir: genç nesil, eski nesil ve kalıcı nesil. Çoğu nesne başlangıçta genç nesilde tahsis edilir. Eski nesil, bazı genç nesil koleksiyonlarında hayatta kalan nesneleri ve doğrudan eski nesilde tahsis edilebilecek bazı büyük nesneleri içerir. Kalıcı nesil, JVM'nin sınıfları ve yöntemleri tanımlayan nesneler gibi sınıfları ve yöntemleri kendileri gibi çöp toplayıcının yönetmesini uygun bulduğu nesneleri barındırır.


1

SunHotSpot JVM'deki bellek üç kuşakta düzenlenmiştir: genç nesil, eski nesil ve kalıcı nesil.

  • Genç Nesil: Yeni oluşturulan nesneler genç genlere tahsis edilir.
  • Eski Nesil: Yeni nesne daha büyük bir yığın alanı isterse, doğrudan eski gene tahsis edilir. Ayrıca birkaç GC döngüsünde hayatta kalan nesneler eski genlere yükseltilir, yani eski gende uzun ömürlü nesneler evi.
  • Kalıcı Nesil: Kalıcı nesil, JVM'nin sınıfları ve yöntemleri tanımlayan nesnelerin yanı sıra sınıfları ve yöntemleri kendileri gibi çöp toplayıcısının yönetmesi için uygun bulduğu nesneleri barındırır.

Bilginize: Kalıcı gen, Java yığınının bir parçası olarak kabul edilmez.

Üç kuşak birbirleriyle nasıl etkileşir / ilişki kurar? Nesneler (büyük olanlar hariç) önce genç kuşağa tahsis edilir. Bir nesne x no. çöp toplama döngülerinin eski / tenure genine yükseltilir. Bu nedenle, genç genin kısa ömürlü nesneleri içerdiğini söyleyebiliriz, eski gen uzun ömürlü nesneleri içerir. Kalıcı gen diğer iki nesil ile etkileşime girmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.