Apa yang dilakukan -XX: MaxPermSize?

260

Secara khusus, mengapa itu membantu untuk memperbaiki masalah PermGen OutOfMemoryError?

Juga, poin bonus untuk jawaban yang mengarahkan saya ke dokumentasi tentang argumen JVM ...

Geoff
sumber
6
oracle.com/technetwork/java/javase/tech/… Bagaimana Anda memberi saya poin bonus sekarang? :)
Denys Séguret
1
@PaulTomblin Saya tidak yakin orang yang artikelnya Anda tautkan (hasil pertama oleh Google) tahu apa yang ia bicarakan.
Denys Séguret
@distroy saya bisa mengirimi Anda cookie? Atau Anda bisa menerima kepuasan dalam pertanyaan yang dijawab dengan baik;)
Geoff
5
Ini tidak menjawab pertanyaan secara khusus tetapi jika Anda melihat manajemen memori JVM, artikel terbaik yang saya baca adalah ini dan tautan infoq
Abe

Jawaban:

274

Ruang permanen adalah tempat kelas, metode, string yang diinternalisasi, dan objek serupa yang digunakan oleh VM disimpan dan tidak pernah dialokasikan (karena itu namanya).

Artikel Oracle ini secara ringkas menyajikan kerja dan parameterisasi dari HotSpot GC dan menyarankan Anda untuk menambah ruang ini jika Anda memuat banyak kelas (ini biasanya terjadi pada server aplikasi dan beberapa IDE seperti Eclipse):

Generasi permanen tidak memiliki dampak nyata pada kinerja pengumpul sampah untuk sebagian besar aplikasi. Namun, beberapa aplikasi secara dinamis menghasilkan dan memuat banyak kelas; misalnya, beberapa implementasi halaman JavaServer Pages (JSP). Aplikasi ini mungkin membutuhkan generasi permanen yang lebih besar untuk mengadakan kelas tambahan. Jika demikian, ukuran pembangkitan permanen maksimum dapat ditingkatkan dengan opsi baris perintah -XX: MaxPermSize =.

Perhatikan bahwa dokumentasi Oracle lainnya ini mencantumkan argumen HotSpot lainnya.

Pembaruan: Dimulai dengan Java 8, ruang permgen dan pengaturan ini hilang. Model memori yang digunakan untuk kelas dan metode yang dimuat berbeda dan tidak terbatas (dengan pengaturan default). Anda seharusnya tidak melihat kesalahan ini lagi.

Denys Séguret
sumber
93

-XX:PermSize -XX:MaxPermSize digunakan untuk mengatur ukuran untuk Generasi Permanen.

Generasi Permanen: Generasi Permanen adalah tempat file kelas disimpan. Ini adalah hasil dari kelas yang dikompilasi dan halaman JSP. Jika ruang ini penuh, itu memicu Koleksi Sampah Penuh. Jika Full Garbage Collection tidak dapat membersihkan kelas lama yang tidak direferensikan dan tidak ada ruang tersisa untuk memperluas Ruang Permanen, kesalahan Out-of-Memory (OOME) dilemparkan dan JVM akan crash.

batu333
sumber
48

Di Java 8 parameter itu biasanya digunakan untuk mencetak pesan peringatan seperti ini:

Peringatan Java HotSpot (TM) 64-Bit Server VM: opsi abaikan MaxPermSize = 512m; dukungan telah dihapus di 8.0

Alasan mengapa Anda mendapatkan pesan ini di Java 8 adalah karena Permgen telah digantikan oleh Metaspace untuk mengatasi beberapa kelemahan PermGen (karena Anda dapat melihat sendiri, salah satu kelemahannya adalah bahwa ia memiliki ukuran tetap).

FYI: artikel tentang Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html

AndrewBourgeois
sumber
6
Lihat juga: PermGen eliminasi di JDK 8 (stackoverflow).
akan