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

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

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

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

Ответы

Ответ 1

Это одна из новых возможностей Java 8, часть Предложения JDK Enhancement 122:

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

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

Ответ 2

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

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

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

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

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

Настройка Metaspace

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

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

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

Также улучшена функция GC. Подробнее

Ответ 3

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

Ответ 5

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

Ответ 6

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

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

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

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