Penghapusan permGen di JDK 8

229

Saya telah menginstal JDK 8 dan mencoba menjalankan Eclipse. Saya menerima pesan peringatan berikut:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0 

Apa alasan untuk mengabaikan opsi VM ini?

Shamim Ahmmed
sumber
4
Anda mungkin menemukan ini informatif: javaeesupportpatterns.blogspot.co.uk/2013/02/...
Andrew Martin

Jawaban:

358

Alasan mengabaikan argumen ini adalah generasi permanen telah dihapus di HotSpot untuk JDK8 karena kelemahan berikut

  • Memperbaiki ukuran saat startup - sulit diatur.
  • Jenis Hotspot internal adalah objek Java: Dapat bergerak dengan GC penuh, buram, tidak diketik dengan kuat dan sulit di-debug, diperlukan meta-metadata.
  • Sederhanakan koleksi lengkap: Iterator khusus untuk metadata untuk setiap kolektor
  • Ingin membatalkan alokasi data kelas secara bersamaan dan tidak selama jeda GC
  • Aktifkan peningkatan di masa mendatang yang dibatasi oleh PermGen.

Ruang Generasi Permanen (PermGen) telah sepenuhnya dihapus dan semacam digantikan oleh ruang baru yang disebut Metaspace. Konsekuensi dari penghapusan PermGen adalah bahwa jelas argumen PermSize dan MaxPermSize JVM diabaikan dan Anda tidak akan pernah mendapatkan java.lang.OutOfMemoryError: PermGen error.

Keuntungan dari MetaSpace

  • Manfaatkan properti Spesifikasi Bahasa Jawa: Kelas dan masa hidup metadata yang sesuai dengan kelas loader
  • Per area penyimpanan loader - Metaspace
  • Alokasi linier saja
  • Tidak ada reklamasi individu (kecuali untuk RedefineClasses dan kegagalan pemuatan kelas)
  • Tidak ada pemindaian GC atau pemadatan
  • Tidak ada relokasi untuk objek metaspace

Tuning Metaspace

Ukuran metaspace maksimum dapat diatur menggunakan flag -XX: MaxMetaspaceSize, dan standarnya tidak terbatas, yang berarti hanya memori sistem Anda yang menjadi batasnya. The -XX: Flag tuning MetaspaceSize menentukan ukuran awal metaspace Jika Anda tidak menentukan flag ini, Metaspace akan secara dinamis mengubah ukuran tergantung dari permintaan aplikasi saat runtime.

Perubahan memungkinkan pengoptimalan dan fitur lainnya di masa mendatang

  • Berbagi data kelas aplikasi
  • Optimalisasi koleksi muda, pembongkaran kelas G1
  • Pengurangan ukuran metadata dan proyek jejak kaki JVM internal

Ada peningkatan kinerja GC juga. Lebih detail

pardeep131085
sumber
29
Saya harus menyebutkan bahwa string yang diinternir sebelumnya disimpan di ruang PermGen, tetapi dipindahkan ke tumpukan Jawa utama di Jawa 7.
gparyani
Terima kasih untuk penjelasan rinci.
Pradeep
3
Sedikit pengantar yang lembut untuk khalayak umum (maksud saya terutama orang-orang non-Jawa, mis. Sesama biarawan harus berurusan dengan JVM) tidak akan membahayakan dalam jawaban ini.
ulidtko
117

Ini adalah salah satu fitur baru Java 8, bagian dari JDK Enhancement Proposals 122 :

Hapus generasi permanen dari JVM Hotspot dan dengan demikian kebutuhan untuk menyesuaikan ukuran generasi permanen.

Daftar semua JEP yang akan dimasukkan dalam Java 8 dapat ditemukan di halaman tonggak JDK8 .

assylias
sumber
19

Ruang Permanent Generation (PermGen) telah sepenuhnya dihapus dan semacam digantikan oleh ruang baru yang disebut Metaspace. Konsekuensi dari penghapusan PermGen adalah bahwa jelas argumen JVM PermSize dan MaxPermSize diabaikan dan Anda tidak akan pernah mendapatkan java.lang.OutOfMemoryError: Kesalahan PermGen. JDK 8 HotSpot JVM sekarang menggunakan memori asli untuk representasi metadata kelas dan disebut Metaspace. Baca Lebih Lanjut >>

Dhrumil Shah
sumber
3
'HotSpot JVM sekarang menggunakan memori asli untuk representasi metadata kelas. - dan memori apa yang digunakan oleh HotSpot JVM sebelumnya? Dan apa yang disebut sebagai 'memori asli'?
Andrey M. Stepanov
16

Karena ruang PermGen telah dihapus. Manajemen memori telah berubah sedikit.

java-8-permgen-metaspace

Sebastian Redl
sumber
12

Ruang PermGen digantikan oleh MetaSpace di Java 8. Argumen PermSize dan MaxPermSize JVM diabaikan dan peringatan dikeluarkan jika hadir saat start-up.

Sebagian besar alokasi untuk metadata kelas sekarang dialokasikan dari memori asli. * Kelas yang digunakan untuk menggambarkan metadata kelas telah dihapus.

Perbedaan utama antara PermGen lama dan MetaSpace baru adalah, Anda tidak harus menentukan batas atas penggunaan memori. Anda dapat menjaga batas ruang MetaSpace tidak terbatas. Jadi ketika penggunaan memori meningkat Anda tidak akan mendapatkan kesalahan OutOfMemoryError. Alih-alih memori asli yang dicadangkan ditingkatkan untuk memenuhi peningkatan penggunaan memori.

Anda dapat menentukan batas maksimum ruang untuk MetaSpace, dan kemudian akan membuang OutOfMemoryError: ruang Metadata. Oleh karena itu penting untuk mendefinisikan batas ini dengan hati-hati, sehingga kita dapat menghindari pemborosan memori.

Shubham Pandey
sumber
9

Implementasi JVM Oracle untuk Java 8 menyingkirkan model PermGen dan menggantinya dengan Metaspace .

chrylis -cautiouslyoptimistic-
sumber