Sampai Java 7 ada area dalam memori JVM yang disebut PermGen , tempat JVM digunakan untuk menyimpan kelasnya. Di Jawa 8 itu dihapus dan diganti dengan daerah yang disebut Metaspace .
Apa perbedaan terpenting antara PermGen dan Metaspace?
Satu-satunya perbedaan yang saya tahu adalah bahwa java.lang.OutOfMemoryError: PermGen space
tidak lagi dapat dibuang dan parameter VM MaxPermSize
diabaikan.
Jawaban:
Perbedaan utama dari perspektif pengguna - yang menurut saya jawaban sebelumnya tidak cukup menekankan - adalah bahwa Metaspace secara default meningkat otomatis ukurannya (hingga apa yang disediakan OS yang mendasarinya), sementara PermGen selalu memiliki ukuran maksimum yang tetap. Anda dapat mengatur maksimum tetap untuk Metaspace dengan parameter JVM, tetapi Anda tidak dapat membuat PermGen meningkat otomatis.
Sebagian besar itu hanya perubahan nama. Kembali ketika PermGen diperkenalkan, tidak ada Java EE atau pemuatan kelas dinamis (un), jadi setelah kelas dimuat, kelas itu macet di memori sampai JVM ditutup - jadi Permanent Generation. Kelas saat ini dapat dimuat dan dibongkar selama masa pakai JVM, sehingga Metaspace lebih cocok untuk area tempat metadata disimpan.
Keduanya berisi
java.lang.Class
instance dan keduanya mengalami kebocoran ClassLoader . Satu-satunya perbedaan adalah bahwa dengan pengaturan default Metaspace, dibutuhkan waktu lebih lama sampai Anda melihat gejalanya (karena ini meningkat secara otomatis sebanyak mungkin), yaitu Anda hanya mendorong masalah lebih jauh tanpa menyelesaikannya. OTOH Saya membayangkan efek kehabisan memori OS bisa lebih parah daripada hanya kehabisan JVM PermGen, jadi saya tidak yakin itu banyak perbaikan.Apakah Anda menggunakan JVM dengan PermGen atau dengan Metaspace, jika Anda melakukan pembongkaran kelas dinamis, Anda harus mengambil tindakan terhadap kebocoran classloader, misalnya dengan menggunakan pustaka Pencegahan Kebocoran ClassLoader saya .
sumber
Bye, Bye PermGen, Halo Metaspace
PermGen telah dihapus seluruhnya.
Pengumpulan sampah metaspace - Pengumpulan sampah dari kelas dan pemuat kelas yang mati dipicu setelah penggunaan metadata kelas mencapai
MaxMetaspaceSize
.Ruang
Metadata
yang dimiliki tidak lagi bersebelahan denganJava heap
, Themetadata
sekarang telah dipindahkan ke memori asli ke suatu daerah yang dikenal sebagaiMetaspace
.Dengan kata sederhana ,
Karena metadata kelas dialokasikan dari memori asli, ruang maksimal yang tersedia adalah total memori sistem yang tersedia. Dengan demikian, Anda tidak akan lagi bertemu
OOM errors
dan akhirnya bisa tumpah ke ruang swap.Penghapusan
PermGen
tidak berarti bahwa masalah kebocoran loader kelas Anda telah hilang. Jadi, ya, Anda masih harus memantau konsumsi dan merencanakannya dengan semestinya, karena kebocoran pada akhirnya akan menghabiskan seluruh memori asli Anda.Beberapa artikel lainnya, dengan analisis: Link1 , Link2 , dan ini
sumber
Singkatnya, ukuran Metaspace otomatis meningkat dalam memori native sebagaimana diperlukan untuk memuat metadata kelas jika tidak dibatasi
-XX:MaxMetaspaceSize
sumber