PermGen aslında ne anlama geliyor?


122

PermGen'in ne olduğunu, ne için kullanıldığını, neden başarısız olduğunu, nasıl artırılacağını vb. Biliyorum.

Bilmediğim şey, PermGen'in gerçekte ne anlama geldiği. Kalıcı ... Gen ... bir şey?

PermGen'in gerçekte ne anlama geldiğini bilen var mı?


1
[İyi açıklama] [1] GC internals hakkında çok şey bilen adamdan. Bu arada, blogunda GC ile ilgili birçok yararlı bilgi var. [1]: blogs.oracle.com/jonthecollector/entry/…
Ivan Dubrov

Yanıtlar:


84

Kalıcı Nesil. Detaylar elbette uygulamaya özeldir.

Kısaca, sınıflar ve dahili dizeler ile ilişkili Java nesnelerini içerir. Sun'ın paylaşım açık olan istemci uygulamasında classes.jsa, bellek eşlemesi ilk verileri oluşturmak için yaklaşık yarısı salt okunur ve yarısı yazılırken kopyalama ile eşleştirilir.

Yalnızca eski olan Java nesneleri Tenured Generation'da tutulur.


19
"JDK 7'de, dahili dizeler artık kalıcı Java yığınının oluşturulmasında tahsis
edilmiyor

30
Ve JDK 8'de hiç kalıcı bir nesil yoktur! Bu cevabın yıllar içinde değiştiğini görmek eğlenceli.
Brian Gordon

3
@BrianGordon doğru .. Bununla ilgili daha fazla bilgi için: stackoverflow.com/a/22509753/4557537
Fadi

59

PermGen, JVM tarafından yüklenen sınıfları tutmak için kullanılır. Şunları kullanarak artırabilirsiniz:

-XX:MaxPermSize=384m

Sun JVM veya OpenJDK kullanıyorsanız.

Bu nedenle, bir OutOfMemoryException: PermGen alırsanız, ya PermGen'i büyütmeniz gerekir ya da sınıf yükleyici problemleriniz olabilir.


6
Bu yorumu yayınladığınızda hangi cevap kabul edildi? Şu anda kabul edilen cevap ( bu , "Tom Hawtin - tackline" tarafından) bana doğru görünüyor. İnsanların kabul edilen mevcut cevaba güvenmemelerine yol açmayacak şekilde yorumunuzu düzenlemek mantıklı olabilir mi?
jbyler


8

Orijinal soruyla gerçekten alakalı değil, ancak birisi bunu faydalı bulabilir. PermGen, Java'nın sınıflarını tuttuğu bellekte gerçekten bir alandır. Yani, çoğumuz, örneğin çok sayıda sınıf olsaydı, PermGen'de OOM ile karşılaştık.

Java 8'den bu yana, PermGen alanı, daha verimli ve varsayılan olarak sınırsız olan (veya daha kesin olarak - 32 veya 64 bit jvm ve işletim sistemi sanal bellek kullanılabilirliğine bağlı olarak yerel bellek miktarı ile sınırlı) MetaSpace alanı ile değiştirildi. Bununla birlikte, örneğin alan için bir maksimum sınır belirleyerek, bazı şekillerde ayarlamak mümkündür. Bu blog gönderisinde daha yararlı bilgiler bulabilirsiniz .




3

Doğru hatırlıyorsam, kuşak çöp toplayıcıda olduğu gibi (daha genç nesnelere orta yaştaki ve "kalıcı" nesnelerden farklı davranan) gen nesli temsil eder. Yerellik ilkesi, yeni oluşturulan nesnelerin önce silineceğini öne sürüyor.


1

Permgen, Kalıcı Nesil anlamına gelir. JVM bellek alanlarından biridir. MaxPermSize adlı bir bayrak kullanarak Heap'in sabit boyutlu bir parçasıdır.

Neden "PermGen" adı?

Bu permgen Java'nın ilk günlerinde adlandırıldı. Permgen ana şebekesi, yüklenen sınıfların tüm meta verilerini tutar. Ancak sorun şu ki, bir sınıf yüklendiğinde, JVM kapanana kadar JVM'de kalacaktır. Yani permgen adı bunu tercih ediyor. Ancak daha sonra, sınıfların dinamik yüklenmesi gündeme geldi ancak isim değişmedi. Ancak Java 8 ile bu sorunu da ele aldılar. Şimdi permagen olarak değiştirildi MetaSpace dinamik hafıza boyutu ile.

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.