PermGen ve Metaspace arasındaki fark nedir?


118

Java 7'ye kadar JVM belleğinde JVM'nin sınıflarını sakladığı PermGen adlı bir alan vardı . In Java 8 kaldırıldı ve denilen alanın yerini Metaspace .

Ne en önemli farklılıklar PermGen ve Metaspace arasında?

Bildiğim tek fark, java.lang.OutOfMemoryError: PermGen spaceartık atılamaması ve VM parametresinin MaxPermSizegöz ardı edilmesi.



@ the8472 Evet, ancak bu (ve diğer birçok) google sonuçları yalnızca Metaspace mekanizmasını açıklıyor, bununla PermGen arasındaki kesin farklardan bahsetmiyor.
Kao

Yanıtlar:


137

Kullanıcı perspektifinden temel fark - ki önceki cevabın yeterince vurgulamadığını düşünüyorum - Metaspace'in varsayılan olarak otomatik olarak boyutunu artırması (temeldeki işletim sisteminin sağladığı şeye kadar), PermGen'in her zaman sabit bir maksimum boyuta sahip olmasıdır. JVM parametreleriyle Metaspace için sabit bir maksimum belirleyebilir, ancak PermGen'i otomatik olarak artıramazsınız.

Büyük ölçüde bu sadece bir isim değişikliğidir. PermGen piyasaya sürüldüğünde, Java EE veya dinamik sınıf (un) yüklemesi yoktu, bu nedenle bir sınıf yüklendiğinde, JVM kapanana kadar bellekte sıkışmıştı - dolayısıyla Kalıcı Üretim. Günümüzde sınıflar, JVM'nin ömrü boyunca yüklenebilir ve boşaltılabilir, bu nedenle Metaspace, meta verilerin tutulduğu alan için daha mantıklıdır.

Her ikisi de java.lang.Classörnekleri içerir ve her ikisi de ClassLoader sızıntılarından muzdariptir . Tek fark, Metaspace varsayılan ayarlarıyla, semptomları fark edene kadar daha uzun sürmesidir (çünkü olabildiğince otomatik olarak artar), yani sorunu çözmeden sadece daha uzağa itersiniz. OTOH İşletim sistemi belleğinin tükenmesinin etkisinin JVM PermGen'in tükenmesinden daha şiddetli olabileceğini düşünüyorum, bu yüzden bunun bir gelişme olduğundan emin değilim.

İster PermGen ile ister Metaspace ile bir JVM kullanıyor olun, dinamik sınıf boşaltma yapıyorsanız, örneğin ClassLoader Leak Prevention kitaplığımı kullanarak sınıf yükleyici sızıntılarına karşı önlemler almalısınız .


17
Ne Permgen ne de Metaspace, Class Class'ın örneklerini içermez. Yalnızca yüklenen sınıflarla ilgili meta bilgileri tutarlar. Sınıf Sınıfının örnekleri, diğer sınıfların örnekleri gibi düzenli bir yığın halinde tutulur.
Ortalama Joe

Güzel karşılaştırma. Teşekkürler
Sandeep

1
Bu arada, OTOH "Diğer Elde" anlamına gelir
sofs1

43

Hoşçakal, Hoşçakal PermGen, Merhaba Metaspace

PermGen tamamen kaldırıldı.

Metaspace çöp toplama - Ölü sınıfların ve sınıf yükleyicilerin çöp toplama işlemi , sınıf meta verileri kullanımı MaxMetaspaceSize.

Boşluk Metadatagerçekleştirildi artık bitişik olan Java heap, metadatahemen olarak bilinen bir bölgeye özgü bellek taşınmıştır Metaspace.

Basit bir deyişle ,

Sınıf meta verileri yerel bellekten ayrıldığından, maksimum kullanılabilir alan, kullanılabilir toplam sistem belleğidir. Böylece, artık karşılaşmazsınız OOM errorsve takas alanına sızabilirsiniz.

Öğesinin kaldırılması, PermGensınıf yükleyici sızıntı sorunlarınızın ortadan kalktığı anlamına gelmez. Yani, evet, bir sızıntı tüm yerel belleğinizi tüketeceğinden, tüketiminizi yine de izlemeniz ve buna göre planlamanız gerekecek.

Analiz içeren diğer bazı makaleler: Link1 , Link2 ve bu


6
MaxPermGen yerine MaxMetaspaceSize var, bu yüzden daha fazla veya daha az bellek kullanması veya daha az kontrole sahip olmanız için bir neden yok.
Peter Lawrey

2
burada hangi anıdan bahsediyoruz? RAM belleği veya HDD belleği.
Dinesh

1
@Dinesh RAM (dahili bellek)
Aditya Gupta

10

Kısacası, Metaspace boyutu yerel bellekte otomatik olarak artar ve kısıtlanmadıysa sınıf meta verilerini yüklemek için -XX:MaxMetaspaceSize

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.