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


229

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

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

Каковы причины игнорирования этой опции виртуальной машины?


4
Вы можете найти это информативным: javaeesupportpatterns.blogspot.co.uk/2013/02/…
Эндрю Мартин

Ответы:


358

Причины игнорирования этого аргумента в том, что в 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. Более детально


29
Я должен упомянуть, что интернированные строки ранее хранились в пространстве PermGen, но были перемещены в основную кучу Java в Java 7.
gparyani

Спасибо за подробное объяснение.
Прадип

3
Немного деликатного введения для широкой аудитории (я имею в виду, прежде всего, людей, не являющихся Java, например, поддерживающих разработчиков, имеющих дело с JVM), не повредит этому ответу.
ulidtko

117

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

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

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


19

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


3
«HotSpot JVM теперь использует собственную память для представления метаданных класса. - а какую память HotSpot JVM использовал ранее? И что такое «родная память»?
Степанов Андрей Михайлович


12

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

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

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

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


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