Apa perbedaan antara PermGen dan Metaspace?

118

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 spacetidak lagi dapat dibuang dan parameter VM MaxPermSizediabaikan.

Kao
sumber
hasil google pertama: infoq.com/articles/Java-PERMGEN-Removed
the8472
@ the8472 Ya, tapi ini (dan banyak lainnya) hasil google menjelaskan hanya mekanisme Metaspace, tidak menyebutkan apapun tentang perbedaan yang tepat antara ini dan PermGen.
Kao

Jawaban:

137

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.Classinstance 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 .

Mattias Jiderhamn
sumber
17
Baik Permgen, maupun Metaspace tidak berisi instance kelas kelas. Mereka hanya menyimpan informasi meta tentang kelas yang dimuat. Instance dari kelas Kelas disimpan dalam heap reguler, seperti contoh kelas lainnya.
Rata
Perbandingan yang bagus. Terima kasih
Sandeep
1
Omong-omong, OTOH berarti, "Di
Sisi
43

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 mencapaiMaxMetaspaceSize .

Ruang Metadatayang dimiliki tidak lagi bersebelahan dengan Java heap, The metadatasekarang telah dipindahkan ke memori asli ke suatu daerah yang dikenal sebagai Metaspace.

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 errorsdan 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

Ankur Singhal
sumber
6
Alih-alih MaxPermGen Anda memiliki MaxMetaspaceSize, jadi tidak ada alasan ia akan menggunakan lebih banyak, atau lebih sedikit memori atau Anda memiliki lebih sedikit kendali.
Peter Lawrey
2
memori apa yang kita bicarakan di sini? Memori RAM atau memori HDD.
Dinesh
1
@Dinesh RAM (memori internal)
Aditya Gupta
10

Singkatnya, ukuran Metaspace otomatis meningkat dalam memori native sebagaimana diperlukan untuk memuat metadata kelas jika tidak dibatasi -XX:MaxMetaspaceSize

Chandrasekaran
sumber