Що насправді означає PermGen?


122

Я знаю, що таке PermGen, для чого він використовується, чому він не працює, як його збільшити і т.д.

Що я не знаю, це те, на що насправді виступає PermGen. Постійний ... Ген ... щось?

Хтось знає, що насправді означає PermGen?


1
[Хороший опис] [1] від хлопця, який багато знає про внутрішні організації GC. У його блозі, до речі, є багато корисної інформації, пов’язаної з ГК. [1]: blogs.oracle.com/jonthecollector/entry/…
Іван Дубров

Відповіді:


84

Постійне покоління. Деталі, звичайно, конкретні для впровадження.

Якщо коротко, він містить об'єкти Java, пов'язані з класами та інтернованими рядками. У впровадженні клієнта Sun із включеним спільним доступом classes.jsaкарта пам'яті відображається для формування початкових даних з приблизно половиною лише для читання та половиною копіювання на запис.

Об'єкти Java, які є лише старими, зберігаються в поколінні Tenured.


19
"У JDK 7 інтерновані рядки більше не виділяються в постійне покоління купи Java": oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi

30
А в JDK 8 взагалі немає постійного покоління! Приємно бачити, як ця відповідь змінюється роками.
Брайан Гордон

3
@BrianGordon вірно .. Докладніше про це: stackoverflow.com/a/22509753/4557537
Fadi

59

PermGen використовується JVM для проведення завантажених класів. Ви можете збільшити його за допомогою:

-XX:MaxPermSize=384m

якщо ви використовуєте Sun JVM або OpenJDK.

Отже, якщо у вас є OutOfMemoryException: PermGen, вам потрібно зробити PermGen більшим, або у вас можуть виникнути проблеми з завантажувачем класів.


6
Яка відповідь була прийнятою на момент публікації цього коментаря? На даний момент прийнята відповідь ( ця , від «Тома Хотіна - лінійка») мені здається точною. Можливо, має сенс редагувати ваш коментар, щоб це не приводило людей до недовіри до прийнятої відповіді?
jbyler


8

Насправді не пов'язане з оригінальним питанням, але, можливо, хтось вважатиме це корисним. PermGen - це дійсно область пам’яті, де Java зберігала свої класи. Отже, багато хто з нас натрапили на OOM в PermGen, якби було, наприклад, багато занять.

Оскільки Java 8, область PermGen була замінена областю MetaSpace, яка є більш ефективною і необмеженою за замовчуванням (а точніше - обмежена кількістю рідної пам'яті, залежно від 32 або 64 біт jvm та наявності віртуальної пам'яті ОС). Однак можна налаштувати його деякими способами, наприклад, вказавши максимальну межу для області. Ви можете знайти більше корисної інформації в цій публікації в блозі .




3

Якщо я добре пам’ятаю, ген означає покоління, як у поколінні сміттєзбірника (який ставиться до молодших об'єктів інакше, ніж до об’єктів середнього віку та до «постійних» об’єктів). Принцип місцевості говорить про те, що нещодавно створені об’єкти будуть стерти першими.


1

Permgen означає постійне покоління. Це одна з областей пам'яті JVM. Це частина Heap з фіксованим розміром, використовуючи прапор MaxPermSize.

Чому назва "PermGen"?

Цей пермген був названий в перші дні Яви. Пермгенська мережа зберігає всі метадані завантажених класів. Але проблема полягає в тому, що після завантаження класу він залишатиметься в JVM до відключення JVM. Тож назва permgen вибирає саме це. Але пізніше динамічне завантаження класів увійшло до зображення, але назва не змінилася. Але з Java 8 вони також вирішили це питання. Тепер permagen був перейменований у MetaSpace з динамічним розміром пам'яті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.