Усунення 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 

Які причини ігнорування цієї опції VM?


4
Ви можете знайти цю інформацію: javaeesupportpatterns.blogspot.co.uk/2013/02/…
Andrew Martin

Відповіді:


358

Причини ігнорування цього аргументу постійного покоління було видалено в HotSpot для JDK8 через наступні недоліки

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

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

Переваги MetaSpace

  • Скористайтеся властивістю специфікації мови Java: Класи та пов'язані з ними терміни життя метаданих відповідають завантажувачу класів
  • На область зберігання завантажувача - Metaspace
  • Тільки лінійне виділення
  • Немає індивідуальної рекультивації (крім RedefineClasses та відмови завантаження класу)
  • Немає сканування або ущільнення GC
  • Немає переміщення для об’єктів метапростору

Налаштування метапростору

Максимальний розмір метапростору можна встановити за допомогою прапора -XX: MaxMetaspaceSize, а за замовчуванням необмежений, що означає, що обмеження має лише ваша системна пам'ять. Прапор налаштування -XX: MetaspaceSize визначає початковий розмір метапростору. Якщо ви не вказали цей прапор, метапростір буде динамічно змінювати розмір залежно від потреби програми під час виконання.

Зміна дозволяє в майбутньому інші оптимізації та функції

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

Також є покращене виконання ГК. Більш детально


29
Я мушу зазначити, що інтерновані рядки раніше зберігалися в просторі PermGen, але були переміщені до основної купи Java на Java 7.
gparyani

Дякую за детальне пояснення.
Pradeep

3
Трохи щадне вступ для загальної аудиторії (я маю на увазі переважно людей, які не є Java, наприклад, товариші по службі, які мають справу з JVM), не зашкодить цій відповіді.
улідко

117

Це одна з нових функцій Java 8, що є частиною пропозицій щодо вдосконалення JDK 122 :

Видаліть постійне покоління з СПГ Hotspot і, таким чином, потрібно налаштувати розмір постійного покоління.

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


19

Простір перманентного покоління (PermGen) повністю видалено і його начебто замінено новим простором під назвою Metaspace. Наслідки видалення PermGen полягають у тому, що очевидно аргументи PermSize та MaxPermSize JVM ігноруються, і ви ніколи не отримаєте java.lang.OutOfMemoryErrorпомилку: PermGen. Тепер JVM JDK HotSpot використовує вбудовану пам'ять для представлення метаданих класу і називається Metaspace. Детальніше >>


3
'HotSpot JVM тепер використовує вбудовану пам'ять для представлення метаданих класу. - а яку пам'ять HotSpot JVM використовував раніше? А що таке "рідна пам'ять"?
Степанов Андрій Михайлович


12

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

Більшість асигнувань для метаданих класу зараз виділяються з рідної пам'яті. * Класи, які використовувались для опису метаданих класу, видалено.

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

Ви можете визначити максимальну межу простору для MetaSpace, і тоді він викине простір метаданих OutOfMemoryError: Таким чином, важливо обережно визначити цю межу, щоб ми могли уникнути втрати пам’яті.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.