Что на самом деле означает PermGen?


122

Я знаю, что такое PermGen, для чего он используется, почему не работает, как его увеличить и т. Д.

Я не знаю, что на самом деле означает PermGen. Постоянно ... Ген ... что-то?

Кто-нибудь знает, что на самом деле означает PermGen?


1
[Хорошее описание] [1] от парня, который много знает о внутреннем устройстве GC. Кстати, в его блоге есть много полезной информации, связанной с GC. [1]: blogs.oracle.com/jonthecollector/entry/…
Иван Дубров,

Ответы:


84

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

Вкратце, он содержит объекты Java, связанные с классами и интернированными строками. В клиентской реализации Sun с включенным совместным использованием classes.jsaпамять отображается для формирования исходных данных, причем половина из них предназначена только для чтения, а половина - для копирования при записи.

Просто старые объекты Java сохраняются в Tenured Generation.


19
«В JDK 7 интернированные строки больше не выделяются в постоянной генерации кучи Java»: oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi

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

3
@BrianGordon прав .. Для получения дополнительной информации об этом: stackoverflow.com/a/22509753/4557537
Фади

59

PermGen используется JVM для хранения загруженных классов. Вы можете увеличить его, используя:

-XX:MaxPermSize=384m

если вы используете Sun JVM или OpenJDK.

Поэтому, если вы получаете OutOfMemoryException: PermGen, вам нужно либо увеличить PermGen, либо у вас могут возникнуть проблемы с загрузчиком классов.


6
Какой ответ был принят на момент публикации этого комментария? В настоящее время принятый ответ (на этот раз от "Tom Hawtin - tackline") мне кажется точным. Может быть имеет смысл отредактировать свой комментарий, чтобы он не заставил людей не доверять текущему принятому ответу?
jbyler


8

Не совсем соответствует исходному вопросу, но, возможно, кому-то это пригодится. PermGen - это действительно область памяти, где Java хранила свои классы. Итак, многие из нас встречали OOM в PermGen, если бы классов было, например, много.

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




3

Если я правильно помню, gen означает поколение, как в сборщике мусора поколений (который обрабатывает более молодые объекты иначе, чем объекты среднего возраста и «постоянные» объекты). Принцип локальности предполагает, что в первую очередь будут уничтожены недавно созданные объекты.


1

Пермген означает «постоянное поколение». Это одна из областей памяти JVM. Это часть кучи с фиксированным размером с помощью флага MaxPermSize.

Почему название «ПермГен»?

Этот перманент был назван на заре Java. Сеть Permgen хранит все метаданные загруженных классов. Но проблема в том, что как только класс загружен, он останется в JVM до выключения JVM. Так что имя permgen - это выбор для этого. Но позже появилась динамическая загрузка классов, но название не изменилось. Но в Java 8 они решили и эту проблему. Теперь пермаген был переименован в MetaSpace с динамическим размером памяти.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.