Java bellek havuzu nasıl bölünür?


224

Şu anda jconsole ile bir Java uygulaması izliyorum. Bellek sekmesi aşağıdakiler arasından seçim yapmanızı sağlar:

Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”

Onların arasındaki fark ne ?


Sun JDK'yı kullandığınızı varsayarsak, en iyi cevap belgelerinde bulunur: Çöp Toplama Ayarı (JDK 1.5) ve Çöp Toplama SSS (JDK 1.4)
kdgregory

Yanıtlar:


327

Yığın belleği

Yığın belleği, Java VM'nin tüm sınıf örnekleri ve diziler için bellek ayırdığı çalışma zamanı veri alanıdır. Yığın, sabit veya değişken boyutta olabilir. Çöp toplayıcı, nesneler için yığın belleği geri alan bir otomatik bellek yönetim sistemidir.

  • Eden Space : Belleğin başlangıçta çoğu nesne için tahsis edildiği havuz.

  • Survivor Space : Cennet mekanının çöp koleksiyonundan kurtulan nesneler içeren havuz.

  • Kiralanmış Nesil veya Eski Nesil : Hayatta kalan alanda bir süredir var olan nesneleri içeren havuz.

Yığın olmayan bellek

Yığın olmayan bellek, tüm iş parçacıkları arasında paylaşılan bir yöntem alanı ve Java VM için dahili işlem veya optimizasyon için gereken belleği içerir. Çalışma zamanı sabit havuzu, alan ve yöntem verileri ve yöntem ve kurucular için kod gibi sınıf başına yapıları depolar. Yöntem alanı mantıksal olarak yığının bir parçasıdır, ancak uygulamaya bağlı olarak bir Java VM çöpü toplamaya veya sıkıştırmayabilir. Yığın belleği gibi, yöntem alanı da sabit veya değişken boyutta olabilir. Yöntem alanı için belleğin bitişik olması gerekmez.

  • Kalıcı Nesil : 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 : HotSpot Java VM ayrıca yerel kodun derlenmesi ve depolanması için kullanılan belleği içeren bir kod önbelleği içerir.

İşte Jconsole'un nasıl kullanılacağına dair bazı belgeler .


4
Java Sanal Makine Spesifikasyonu'nun açıkça belirttiği gibi @ dfa'nın tamamen doğru olduğundan emin değilim: “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.” Bununla birlikte, jconsole'un Kod Önbelleğini ve Kalıcı Nesil'i Yığın Olmayan olarak gösterdiği açıktır, bu da spesifikasyonla çelişmektedir. Herkes bu çelişki hakkında daha fazla açıklık sağlayabilir mi?
James Bloom

@JamesBloom - Ben de aynısını merak ediyordum. Temel tanım hangi bellek havuzunun hangi türe (yığın / yığın olmayan) ait olduğunu belirtse de, durum açıkça değişebilir mi?
Umang Desai

2
Bu semingly gelen nicked doc: docs.intergral.com/pages/viewpage.action?pageId=22478944 doc JVM hakkında bazı diğer iyi bilgi, değer göz içeriyor
Steve Siebert

1
Birçok upvotes rağmen, aslında çok anlamlı bir cevap değil. Örneğin, "Eden alanının çöp koleksiyonundan kurtulan nesneler" ne anlama geliyor? Bu nesneler hayatta kaldıktan sonra Eden'den Survivor Space'e mi taşınıyor veya Eden'deki alanları Survivor alanı olarak kabul ediliyor mu? Eden alanı dışındaki havuzlarda çöp toplamaya ne dersiniz? Tamamen net değil.
Mikhail Batcer

ve yığın (un yığın olmayan tarafta) unutmayın :)
Toothless Seer

70

Yeni anahtar kelime belleği Java yığınına ayırır. Yığın, uygulamanın tamamı için erişilebilir olan ana bellek havuzudur. Bu nesne için ayrılacak yeterli bellek yoksa, JVM bir çöp toplama işlemiyle bazı belleği yığıntan geri almaya çalışır. Hala yeterli bellek alamıyorsa, bir OutOfMemoryError atılır ve JVM çıkar.

Yığın, nesiller olarak adlandırılan birkaç farklı bölüme ayrılmıştır. Nesneler daha fazla çöp koleksiyonundan sağ çıktıkça, farklı nesillere terfi ederler. Eski nesiller sık ​​sık çöp toplanmaz. Bu nesnelerin daha uzun ömürlü olduğu zaten kanıtlanmış olduğundan, çöplerin toplanma olasılığı daha düşüktür.

Nesneler ilk inşa edildiğinde, Eden Space'e tahsis edilir. Bir çöp koleksiyonundan hayatta kalırlarsa, Survivor Space'e yükseltilirler ve orada yeterince uzun yaşarlarsa, Tenured Generation'a tahsis edilirler. Bu nesil çok daha az sıklıkta toplanan çöptür.

Daimi Nesil veya PermGen adı verilen dördüncü bir nesil de var. Burada bulunan nesneler çöp toplanmaya uygun değildir ve genellikle JVM'nin çalışması için gerekli olan sınıf tanımları ve String sabit havuzu gibi değişmez bir durum içerir. PermGen alanının Java 8'den kaldırılması planlandığını ve bunun yerine yerel bellekte tutulacak olan Metaspace adlı yeni bir alanın yerini alacağını unutmayın. referans :http://www.programcreek.com/2013/04/jvm-run-time-data-areas/

resim açıklamasını buraya girin resim açıklamasını buraya girin


Diyagram çok açıklayıcı görünüyor ... Bu herhangi bir GC algoritması için geçerli mi? G1 farklı setlere sahiptir.
Venkateswara Rao

Bence @Pythoner koyu mor bayrak olmalı -XX:PermSizedeğil -XX:MaxPermSizezaten yukarıda tanımlandığı gibidir.
Anurag


23

Java Yığın Belleği , İşletim Sistemi tarafından JVM'ye ayrılan belleğin bir parçasıdır.

Nesneler yığın adı verilen bir alanda bulunur. Yığın, JVM başlatıldığında oluşturulur ve uygulama çalışırken boyutu artabilir veya azalabilir. Öbek dolduğunda, çöp toplanır.

resim açıklamasını buraya girin

Eden Space, Survivor Space, Tenured Space ve Permanent Generation hakkında daha fazla bilgiyi aşağıdaki SE sorusunda bulabilirsiniz:

Genç, Kiralanmış ve Perma üretimi

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

Sorgularınızla ilgili olarak:

  1. Eden Space, Survivor Space, Tenured Space yığın belleğinin bir parçasıdır
  2. Metaspace ve Code Cache yığın olmayan belleğin bir parçasıdır.

Codecache: Java Sanal Makinesi (JVM) yerel kodu oluşturur ve bunu codecache adı verilen bir bellek alanında saklar. JVM, dinamik olarak oluşturulan yorumlayıcı döngüsü, Java Yerel Arabirimi (JNI) saplamaları ve tam zamanında (JIT) derleyici tarafından yerel koda derlenen Java yöntemleri de dahil olmak üzere çeşitli nedenlerle yerel kod üretir. JIT, kodekarenin en büyük kullanıcısı.

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.