Permgen vs Metaspace di Jawa

1. Pengenalan

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

Perlu diingat bahawa, bermula dengan Java 8, Metaspace menggantikan PermGen - membawa beberapa perubahan besar.

2. PermGen

PermGen (Permanent Generation) adalah ruang timbunan khas yang dipisahkan dari timbunan memori utama .

JVM mengawasi metadata kelas yang dimuat di PermGen. Selain itu, JVM menyimpan semua kandungan statik di bahagian memori ini. Ini merangkumi semua kaedah statik, pemboleh ubah primitif, dan rujukan ke objek statik.

Selanjutnya, ia mengandungi data mengenai bytecode, nama, dan maklumat JIT . Sebelum Java 7, String Pool juga merupakan bagian dari memori ini. Kekurangan dari ukuran kolam tetap disenaraikan dalam catatan kami.

Saiz memori maksimum lalai untuk JVM 32-bit ialah 64 MB dan 82 MB untuk versi 64-bit.

Namun, kita dapat mengubah ukuran lalai dengan pilihan JVM:

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

Yang paling penting, Oracle membuang sepenuhnya ruang memori ini dalam keluaran JDK 8. Oleh itu, jika kita menggunakan bendera penalaan ini di Java 8 dan versi yang lebih baru, kita akan mendapat amaran 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 saiz memori yang terhad, PermGen terlibat dalam menghasilkan OutOfMemoryError yang terkenal . Ringkasnya, loader kelas tidak dikumpulkan sampah dengan betul dan, sebagai hasilnya, menimbulkan kebocoran memori.

Oleh itu, kami menerima ralat ruang memori; ini berlaku kebanyakannya di persekitaran pembangunan sambil mencipta pemuat kelas baru.

3. Metaspace

Ringkasnya, Metaspace adalah ruang memori baru - bermula dari versi Java 8; ia telah menggantikan ruang memori PermGen yang lebih lama . Perbezaan yang paling ketara adalah bagaimana menangani peruntukan memori.

Secara khusus, kawasan memori asli ini berkembang secara automatik secara lalai .

Kami juga mempunyai bendera baru untuk menyesuaikan memori:

  • MetaspaceSize dan MaxMetaspaceSize - kita boleh menetapkan batas atas Metaspace.
  • MinMetaspaceFreeRatio - adalah peratusan minimum kapasiti metadata kelas percuma selepas pengumpulan sampah
  • MaxMetaspaceFreeRatio - adalah peratusan maksimum kapasiti metadata kelas selepas pengumpulan sampah untuk mengelakkan pengurangan jumlah ruang

Selain itu, proses pengumpulan sampah juga memperoleh beberapa faedah dari perubahan ini. Pengutip sampah kini secara automatik mencetuskan pembersihan kelas mati setelah penggunaan metadata kelas mencapai ukuran metaspace maksimumnya.

Oleh itu, dengan peningkatan ini, JVM mengurangkan peluang untuk mendapatkan ralat OutOfMemory .

Walaupun terdapat semua peningkatan ini, kami masih perlu memantau dan menyesuaikan metaspace untuk mengelakkan kebocoran memori.

4. Ringkasan

Dalam penulisan ringkas ini, kami memaparkan penerangan ringkas mengenai wilayah memori PermGen dan Metaspace. Selain itu, kami menerangkan perbezaan utama antara masing-masing.

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