it-roy-ru.com

Устранение PermGen в JDK 8

Я установил JDK 8 и пытаюсь запустить Eclipse. Я получаю следующее предупреждение:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0 

По каким причинам игнорируется этот параметр VM?

208
Shamim Ahmmed

Причины игнорирования этого аргумента - постоянная генерация была удалена в HotSpot для JDK8 из-за следующих недостатков

  • Фиксированный размер при запуске - сложно настроить.
  • Внутренние типы горячих точек были объектами Java: могли перемещаться с полным GC, непрозрачными, не сильно типизированными и трудными для отладки, необходимые мета-метаданные.
  • Упрощение полных коллекций: специальные итераторы для метаданных для каждого сборщика
  • Хотите освободить данные класса одновременно, а не во время паузы GC
  • Включить будущие улучшения, которые были ограничены PermGen.

Пространство постоянного поколения (PermGen) полностью удалено и заменено новым пространством под названием Metaspace. Последствия удаления PermGen заключаются в том, что аргументы JVM PermSize и MaxPermSize игнорируются , и вы будете никогда не получайте ошибку Java.lang.OutOfMemoryError: PermGen.

Преимущества MetaSpace

  • Воспользуйтесь преимуществом свойства Java Language Specification: время жизни классов и связанных метаданных соответствует загрузчику классов
  • Складское помещение для погрузчика - Metaspace
  • Только линейное распределение
  • Нет индивидуального восстановления (за исключением RedefineClasses и сбоя загрузки класса)
  • Нет GC сканирования или уплотнения
  • Нет перемещения для объектов мета-пространства

Настройка метапространства

Максимальный размер метапространства можно установить с помощью флага -XX: MaxMetaspaceSize, и по умолчанию он не ограничен, что означает, что пределом является только ваша системная память. Флаг настройки -XX: MetaspaceSize определяет начальный размер метапространства. Если вы не укажете этот флаг, Metaspace будет динамически изменять размер в зависимости от требований приложения во время выполнения.

Изменения позволяют другие оптимизации и функции в будущем

  • Совместное использование данных класса приложения
  • Оптимизация молодой коллекции, выгрузка класса G1
  • Сокращение размера метаданных и внутренние проекты JVM

Также улучшена производительность GC. подробнее

329
pardeep131085

Это одна из новых функций Java 8, часть Предложения по усовершенствованию JDK 122 :

Удалите постоянное поколение из Hotspot JVM и, следовательно, необходимо настроить размер постоянного поколения.

Список всех JEP, которые будут включены в Java 8, можно найти на страница основных этапов JDK8 .

113
assylias

Пространство постоянной генерации (PermGen) полностью удалено и заменено новым пространством под названием Metaspace. Последствия удаления PermGen заключаются в том, что аргументы JVM PermSize и MaxPermSize игнорируются, и вы никогда не получите ошибку Java.lang.OutOfMemoryError: PermGen , JVK JSK 8 HotSpot теперь использует собственную память для представления метаданных класса и называется Metaspace. Подробнее >>

18
Dhrumil Shah

Потому что пространство PermGen было удалено. Управление памятью немного изменилось.

http://Java.dzone.com/articles/Java-8-permgen-metaspace

15
Sebastian Redl

Пространство PermGen заменяется на MetaSpace в Java 8. Аргументы JVM PermSize и MaxPermSize игнорируются и выдается предупреждение, если оно присутствует при запуске.

Большинство выделений для метаданных класса теперь выделяются из собственной памяти. * Классы, которые использовались для описания метаданных класса, были удалены.

Основное отличие старого PermGen от нового MetaSpace заключается в том, что вам не нужно обязательно определять верхний предел использования памяти. Вы можете сохранить ограничение пространства MetaSpace неограниченным. Таким образом, при увеличении использования памяти вы не получите ошибку OutOfMemoryError. Вместо этого зарезервированная собственная память увеличивается, чтобы полностью заполнить увеличение использования памяти.

Вы можете определить максимальный предел пространства для MetaSpace, а затем он выбросит OutOfMemoryError: пространство метаданных. Поэтому важно осторожно определять этот предел, чтобы избежать потери памяти.

10
Shubham Pandey

Реализация Oracle JVM для Java 8 избавилась от модели PermGen и заменила ее на Metaspace .

8
chrylis