Permgen vs Metaspace di Java

1. Perkenalan

Dalam tutorial singkat ini, kita akan memeriksa perbedaan antara wilayah memori PermGen dan Metaspace di lingkungan Java.

Penting untuk diingat bahwa, dimulai dengan Java 8, Metaspace menggantikan PermGen - membawa beberapa perubahan substansial.

2. PermGen

PermGen (Permanent Generation) adalah ruang heap khusus yang dipisahkan dari heap memori utama .

JVM melacak metadata kelas yang dimuat di PermGen. Selain itu, JVM menyimpan semua konten statis di bagian memori ini. Ini mencakup semua metode statis, variabel primitif, dan referensi ke objek statis.

Selain itu , berisi data tentang bytecode, nama, dan informasi JIT . Sebelum Java 7, String Pool juga merupakan bagian dari memori ini. Kerugian dari ukuran kolam tetap tercantum dalam artikel kami.

Ukuran memori maksimum default untuk JVM 32-bit adalah 64 MB dan 82 MB untuk versi 64-bit.

Namun, kami dapat mengubah ukuran default dengan opsi JVM:

  • -XX: PermSize = [size] adalah ukuran awal atau minimum dari ruang PermGen
  • -XX: MaxPermSize = [size] adalah ukuran maksimum

Yang terpenting, Oracle benar-benar menghapus ruang memori ini dalam rilis JDK 8. Oleh karena itu, jika kita menggunakan flag tuning ini di Java 8 dan versi yang lebih baru, kita akan mendapatkan peringatan berikut:

>> java -XX:PermSize=100m -XX:MaxPermSize=200m -version OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0 OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0 ...

Dengan ukuran memori yang terbatas, PermGen terlibat dalam menghasilkan OutOfMemoryError yang terkenal . Sederhananya, pemuat kelas tidak mengumpulkan sampah dengan benar dan, akibatnya, menghasilkan kebocoran memori.

Oleh karena itu, kami menerima kesalahan ruang memori; ini sebagian besar terjadi di lingkungan pengembangan saat membuat pemuat kelas baru.

3. Metaspace

Sederhananya, Metaspace adalah ruang memori baru - mulai dari versi Java 8; itu telah menggantikan ruang memori PermGen yang lebih lama . Perbedaan paling signifikan adalah cara menangani alokasi memori.

Secara khusus, wilayah memori asli ini tumbuh secara otomatis secara default .

Kami juga memiliki tanda baru untuk menyesuaikan memori:

  • MetaspaceSize dan MaxMetaspaceSize - kita dapat mengatur batas atas Metaspace.
  • MinMetaspaceFreeRatio - adalah persentase minimum kapasitas metadata kelas yang kosong setelah pengumpulan sampah
  • MaxMetaspaceFreeRatio - adalah persentase maksimum kapasitas metadata kelas yang kosong setelah pengumpulan sampah untuk menghindari pengurangan jumlah ruang.

Selain itu, proses pengumpulan sampah juga mendapatkan beberapa manfaat dari perubahan ini. Pengumpul sampah sekarang secara otomatis memicu pembersihan kelas yang mati setelah penggunaan metadata kelas mencapai ukuran metaspace maksimumnya.

Oleh karena itu, dengan peningkatan ini, JVM mengurangi kemungkinan mendapatkan kesalahan OutOfMemory .

Terlepas dari semua peningkatan ini, kami masih perlu memantau dan menyesuaikan metaspace untuk menghindari kebocoran memori.

4. Ringkasan

Dalam artikel singkat ini, kami menyajikan penjelasan singkat tentang wilayah memori PermGen dan Metaspace. Selain itu, kami menjelaskan perbedaan utama di antara keduanya.

PermGen masih ada dengan JDK 7 dan versi yang lebih lama, tetapi Metaspace menawarkan penggunaan memori yang lebih fleksibel dan andal untuk aplikasi kami.