Apa itu perm space?

88

Saat belajar tentang pembuatan profil memori java, saya terus melihat istilah "perm space" selain "heap." Saya tahu apa itu heap - apa perm space?

cakalang
sumber
13
Java 8 telah sepenuhnya menghapus konsep ini dan dipindahkan ke Metaspace
pramodc84
2
Referensi dijelaskan dengan baik di sini youtube.com/watch?v=PUUJ4rNpRhU
shareef

Jawaban:

103

Itu singkatan dari generasi permanen :

Generasi permanen itu spesial karena menyimpan meta-data yang mendeskripsikan kelas pengguna (kelas yang bukan bagian dari bahasa Java). Contoh dari meta-data tersebut adalah objek yang mendeskripsikan kelas dan metode, dan mereka disimpan di Generasi Permanen. Aplikasi dengan basis kode besar dapat dengan cepat mengisi segmen tumpukan ini yang akan menyebabkan java.lang.OutOfMemoryError: PermGen tidak peduli seberapa tinggi -Xmx Anda dan berapa banyak memori yang Anda miliki di mesin.

Andrew Hare
sumber
Andrew, saya hanya ingin tahu tentang seberapa besar ukuran PerGen?
gks
Hanya ingin tahu apakah permgen adalah bagian dari memori heap (seperti yang dinyatakan dalam jawaban ini) atau off-heap (seperti yang dinyatakan dalam jawaban ini - stackoverflow.com/a/31103100/3061686 ).
akki
26

Perm spacedigunakan untuk menyimpan informasi untuk kelas yang dimuat dan beberapa fitur lanjutan lainnya seperti String Pool(untuk pengujian kesetaraan string yang sangat dioptimalkan), yang biasanya dibuat olehString.intern() metode. Karena aplikasi Anda (jumlah kelas) akan bertambah, ruang ini akan terisi dengan cepat, karena pengumpulan sampah di Space ini tidak terlalu efektif untuk membersihkan seperti yang diperlukan, Anda akan segera mendapatkan Out of Memory: kesalahan ruang gen perm. Setelah itu, tidak ada aplikasi yang akan berjalan pada mesin itu secara efektif bahkan setelah JVM kosong yang besar.

Sebelum memulai aplikasi Anda, Anda harus java -XX:MaxPermSizemenyingkirkan kesalahan ini.

DKSRathore
sumber
Kumpulan string dialihkan ke ruang heap sejak java 7.
Caffeine Coder
20

Jawaban sederhana (dan terlalu disederhanakan): di sinilah jvm menyimpan data pembukuannya sendiri, bukan data Anda.

Matt
sumber
17

Perm Gen adalah singkatan dari generasi permanen yang menyimpan informasi meta-data tentang kelas.

  1. Misalkan jika Anda membuat nama kelas A, variabel instansinya akan disimpan dalam memori heap dan kelas A bersama dengan classloader statis akan disimpan dalam generasi permanen.
  2. Pengumpul sampah akan kesulitan mengosongkan atau mengosongkan ruang memori yang disimpan dalam memori generasi permanen. Oleh karena itu, selalu disarankan untuk menjaga pengaturan memori permgen pada batas yang disarankan.
  3. JAVA8 telah memperkenalkan konsep yang disebut generasi meta-space, sehingga permgen tidak lagi diperlukan jika Anda menggunakan versi jdk 1.8.
Praveen Kumar KS
sumber
5

Ruang permgen adalah area heap yang menampung semua data reflektif dari mesin virtual itu sendiri, seperti objek class dan metode.

Jesse
sumber
3

Ini memegang hal-hal seperti definisi kelas, kumpulan string, dll. Saya kira Anda bisa menyebutnya meta-data.

Nick
sumber
3

Ruang permgen selalu dikenal sebagai area metode. Ketika subsistem pemuat kelas akan memuat file kelas (kode byte) ke area metode (permGen). Ini berisi semua metadata kelas misalnya: Nama kelas Anda yang sepenuhnya memenuhi syarat, Nama kelas induk langsung yang memenuhi syarat sepenuhnya, info variabel, info konstruktor, informasi kumpulan konstan, dll.

Amruta
sumber
2

Apa yang ada di bawah PremGen: Area Kelas berada di bawah area PremGen. Bidang statis juga dikembangkan pada waktu pemuatan kelas, sehingga juga ada di PremGen. Area Pool Konstan memiliki semua bidang tetap yang dikumpulkan seperti String disimpan di sini. Selain itu, data kelas yang dimuat oleh pemuat kelas, array Objek, objek internal yang digunakan oleh jvm juga ditempatkan.

hai .nitish
sumber
1

PermGen Space adalah singkatan dari alokasi memori untuk generasi permanen. Semua objek Java yang tidak dapat diubah termasuk dalam kategori ini, seperti Stringyang dibuat dengan literal atau dengan String.intern()metode dan untuk memuat kelas ke dalam memori. PermGen Space mempercepat pencarian persamaan String kami.

Spark-Beginner
sumber
1
  • JVM memiliki representasi internal objek Java dan representasi internal tersebut disimpan di heap (pada generasi muda atau generasi tetap).
  • JVM juga memiliki representasi internal dari kelas-kelas Java dan mereka disimpan dalam generasi permanen

masukkan deskripsi gambar di sini

Roopesh Payyanath
sumber