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

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

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

Каковы причины игнорирования этого аргумента?

6 ответов

Решение

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

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

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

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

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

Metaspace Tuning

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам