JDK 8'de PermGen eliminasyonu


Yanıtlar:


358

Bu argümanı görmezden gelmenin nedenleri, JDK8 için HotSpot'ta aşağıdaki dezavantajlar nedeniyle kaldırıldı

  • Başlangıçta sabit boyut - ayarlanması zor.
  • Dahili Hotspot türleri Java nesneleridir: Tam GC, opak, güçlü yazılmamış ve hata ayıklaması zor, gerekli meta meta verilerle hareket edebilir.
  • Tüm koleksiyonları basitleştirin: Her bir koleksiyoncu için meta veriler için özel yineleyiciler
  • GC duraklaması sırasında değil, aynı anda sınıf verilerini dağıtmak istiyor
  • PermGen tarafından sınırlandırılan gelecekteki geliştirmeleri etkinleştir.

Kalıcı Nesil (PermGen) alanı tamamen kaldırıldı ve yerini Metaspace adlı yeni bir alan aldı. PermGen kaldırma sonuçları açıkça PermSize ve MaxPermSize JVM bağımsız değişkenleri yoksayılır ve asla bir java.lang.OutOfMemoryError: PermGen hatası almazsınız.

MetaSpace'in Avantajları

  • Java Language Specification özelliğinden yararlanın: Sınıflar ve ilişkili meta veri yaşam süreleri sınıf yükleyiciyle eşleşir
  • Yükleyici depolama alanı başına - Metaspace
  • Yalnızca doğrusal ayırma
  • Bireysel geri kazanım yok (RedefineClasses ve sınıf yükleme hatası hariç)
  • GC taraması veya sıkıştırma yok
  • Metaspace nesneleri için yer değiştirme yok

Metaspace Ayarlama

Maksimum metaspace boyutu -XX: MaxMetaspaceSize bayrağı kullanılarak ayarlanabilir ve varsayılan sınırsızdır, yani yalnızca sistem belleğiniz sınırdır. -XX: MetaspaceSize ayar bayrağı, ilk metaspace boyutunu tanımlar Bu bayrağı belirtmezseniz, Metaspace, çalışma zamanında uygulama talebine bağlı olarak dinamik olarak yeniden boyutlandırılır.

Değişiklik gelecekte diğer optimizasyonları ve özellikleri etkinleştirir

  • Uygulama sınıfı veri paylaşımı
  • Genç koleksiyon optimizasyonları, G1 sınıfı boşaltma
  • Meta veri boyutu küçültme ve dahili JVM ayak izi projeleri

Geliştirilmiş GC performansı da vardır. Daha fazla detay


29
Stajyer dizelerin daha önce PermGen uzayda saklandığını, ancak Java 7'deki ana Java yığınına taşındığını belirtmeliyim.
gparyani

Detaylı açıklama için teşekkürler.
Pradeep

3
Genel kitle için biraz nazik bir giriş (yani öncelikle Java olmayan kişiler, örneğin JVM ile uğraşmak zorunda olan diğer adanmışlar) bu cevapta zarar vermeyecektir.
ulidtko


19

Kalıcı Nesil (PermGen) alanı tamamen kaldırıldı ve yerine Metaspace adı verilen yeni bir alan getirildi java.lang.OutOfMemoryError. JDK 8 HotSpot JVM artık sınıf meta verilerinin temsili için yerel belleği kullanıyor ve Metaspace olarak adlandırılıyor. Daha Fazla Oku >>


3
'HotSpot JVM artık sınıf meta verilerinin temsili için yerel belleği kullanıyor. - ve daha önce hangi bellek HotSpot JVM kullandı? Ve 'doğal bellek' tam olarak nedir?
Andrey M. Stepanov


12

PermGen alanı Java 8'de MetaSpace ile değiştirilir. PermSize ve MaxPermSize JVM bağımsız değişkenleri yok sayılır ve başlangıçta varsa bir uyarı verilir.

Sınıf meta verileri için çoğu ayırma artık yerel bellekten ayrılmıştır. * Sınıf meta verilerini tanımlamak için kullanılan sınıflar kaldırılmıştır.

Eski PermGen ve yeni MetaSpace arasındaki temel fark, bellek kullanımının üst sınırını zorunlu olarak tanımlamanıza gerek olmamasıdır. MetaSpace alan sınırını sınırsız tutabilirsiniz. Böylece bellek kullanımı arttığında OutOfMemoryError hatası almayacaksınız. Bunun yerine, ayrılmış yerel bellek, bellek kullanımını artırmak için doldurulacaktır.

MetaSpace için maksimum alan sınırını tanımlayabilirsiniz ve sonra OutOfMemoryError: Metadata alanını atar. Bu nedenle, bellek israfından kaçınabilmemiz için bu limiti dikkatli bir şekilde tanımlamak önemlidir.


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.