Apa sebenarnya kepanjangan dari PermGen?

122

Saya tahu apa itu PermGen, untuk apa digunakan, mengapa gagal, bagaimana cara meningkatkannya, dll.

Yang tidak saya ketahui adalah apa sebenarnya kepanjangan dari PermGen. Permanen ... Gen ... sesuatu?

Adakah yang tahu apa sebenarnya kepanjangan dari PermGen?

SCdF
sumber
1
[Deskripsi bagus] [1] dari orang yang tahu banyak tentang internal GC. Omong-omong, ada banyak info terkait GC yang berguna di blognya. [1]: blogs.oracle.com/jonthecollector/entry/…
Ivan Dubrov

Jawaban:

84

Generasi Permanen. Detailnya tentu saja spesifik untuk penerapannya.

Singkatnya, ini berisi objek Java yang terkait dengan kelas dan string internal. Dalam implementasi klien Sun dengan berbagi aktif, classes.jsamemori dipetakan untuk membentuk data awal, dengan sekitar setengahnya hanya untuk membaca dan setengah menyalin-saat-menulis.

Benda-benda Jawa yang hanya tua disimpan di Generasi Bertenur.

Tom Hawtin - taktik
sumber
19
"Di JDK 7, string yang diinternir tidak lagi dialokasikan di generasi permanen heap Java": oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi
30
Dan di JDK 8 tidak ada generasi permanen sama sekali! Sangat menyenangkan melihat jawaban ini berkembang selama bertahun-tahun.
Brian Gordon
3
@BrianGordon benar .. Untuk informasi lebih lanjut tentang itu: stackoverflow.com/a/22509753/4557537
Fadi
59

PermGen digunakan oleh JVM untuk menampung kelas yang dimuat. Anda dapat meningkatkannya dengan menggunakan:

-XX:MaxPermSize=384m

jika Anda menggunakan Sun JVM atau OpenJDK.

Jadi, jika Anda mendapatkan OutOfMemoryException: PermGen, Anda perlu memperbesar PermGen atau Anda mungkin mengalami masalah pemuat kelas.

bajafresh4life
sumber
6
Jawaban manakah yang diterima pada saat Anda memposting komentar ini? Jawaban yang diterima saat ini (yang ini , oleh "Tom Hawtin - tackline") terlihat akurat bagi saya. Mungkin masuk akal untuk mengedit komentar Anda sehingga tidak membuat orang tidak mempercayai jawaban yang diterima saat ini?
jbyler
8

Tidak benar-benar terkait dengan pertanyaan asli, tetapi mungkin seseorang akan merasa berguna. PermGen memang area dalam memori tempat Java digunakan untuk menyimpan kelas-kelasnya. Jadi, banyak dari kita pernah menemukan OOM di PermGen, jika ada, misalnya banyak kelas.

Sejak Java 8, area PermGen telah digantikan oleh area MetaSpace, yang lebih efisien dan tidak terbatas secara default (atau lebih tepatnya - dibatasi oleh jumlah memori asli, tergantung pada 32 atau 64 bit jvm dan ketersediaan memori virtual OS). Namun dimungkinkan untuk menyetelnya dalam beberapa cara, misalnya dengan menentukan batas maksimum untuk area tersebut. Anda dapat menemukan lebih banyak informasi berguna di entri blog ini .

Alex K.
sumber
3

Jika saya ingat dengan benar, gen tersebut berarti generasi, seperti pada pengumpul sampah generasi (yang memperlakukan objek yang lebih muda secara berbeda dari objek paruh baya dan objek "permanen"). Prinsip lokalitas menunjukkan bahwa objek yang baru dibuat akan dihapus terlebih dahulu.

Uri
sumber
1

Permgen adalah singkatan dari Permanent Generation. Ini adalah salah satu area memori JVM. Itu bagian dari Heap dengan ukuran tetap dengan menggunakan bendera yang disebut MaxPermSize.

Kenapa namanya "PermGen"?

Permgen ini dinamai pada masa awal Jawa. Induk permgen menyimpan semua data meta dari kelas yang dimuat. Tetapi masalahnya adalah bahwa setelah kelas dimuat, itu akan tetap berada di JVM sampai JVM dimatikan. Jadi pilihlah permgen nama. Tapi kemudian, pembebanan dinamis kelas muncul tapi namanya tidak diubah. Tetapi dengan Java 8 , mereka telah mengatasi masalah itu juga. Sekarang permagen berganti nama menjadi MetaSpace dengan ukuran memori dinamis.

Sumanth Varada
sumber