Що робить -XX: MaxPermSize?


260

Зокрема, чому це допоможе виправити проблему PermGen OutOfMemoryError?

Також бонусні бали за відповідь, яка вказує мені на документацію щодо аргументів JVM ...



6
oracle.com/technetwork/java/javase/tech/… Як тепер ви будете отримувати ці бонусні бали? :)
Denys Séguret

1
@PaulTomblin Я не впевнений, що хлопець, до статті якого ви посилаєтесь (перший результат від Google), має будь-яке уявлення про те, про що він говорить.
Denys Séguret

@dystroy Я можу вам надіслати печиво? Або ви могли просто задовольнити питання, на яке добре відповіли;)
Джефф

5
Це не відповідає конкретно на питання, але якщо ви дивитесь на управління пам’яттю JVM, найкращі статті, які я прочитав на ньому, - це це посилання
Abe

Відповіді:


273

Постійний простір - це місце, де зберігаються класи, методи, інтерналізовані рядки та подібні об'єкти, що використовуються VM, і ніколи не розміщуються (звідси назва).

Ця стаття Oracle коротко представляє роботу та параметризацію HotSpot GC та радить розширити цей простір, якщо ви завантажуєте багато класів (зазвичай це стосується серверів прикладних програм та деяких IDE, таких як Eclipse):

Постійне покоління не робить помітного впливу на продуктивність збору сміття для більшості застосувань. Однак деякі програми динамічно генерують та завантажують багато класів; наприклад, деякі реалізації сторінок JavaServer Pages (JSP). Ці додатки можуть потребувати більшого постійного покоління для проведення додаткових класів. Якщо так, максимальний постійний розмір генерації можна збільшити за допомогою параметра командного рядка -XX: MaxPermSize =.

Зауважте, що ця інша документація Oracle перераховує інші аргументи HotSpot.

Оновлення: Починаючи з Java 8, і простір пермгену, і цей параметр втрачені. Модель пам'яті, що використовується для завантажених класів і методів, відрізняється і не обмежується (з налаштуваннями за замовчуванням). Ви більше не повинні бачити цю помилку.


93

-XX:PermSize -XX:MaxPermSize використовуються для встановлення розміру для постійного покоління.

Постійне покоління: постійне покоління - це місце, де зберігаються файли класів. Це результат складених класів та сторінок JSP. Якщо цей простір заповнений, він запускає Повну колекцію сміття. Якщо повна колекція сміття не зможе очистити старі класи, що не відносяться, і не залишається місця для розширення постійного простору, викидається помилка поза пам'яттю (OOME), і JVM вийде з ладу.


48

У Java 8 цей параметр зазвичай використовується для друку попереджувального повідомлення на зразок цього:

Попередження 64-бітного сервера VM-сервера Java HotSpot (TM): ігнорування опції MaxPermSize = 512м; підтримку було видалено в 8.0

Причина, чому ви отримуєте це повідомлення в Java 8, полягає в тому, що Permgen був замінений Metaspace, щоб вирішити деякі недоліки PermGen (як ви змогли самі переконатися, один з таких недоліків - його фіксований розмір).

FYI: стаття про Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html


6
Дивіться також: Усунення PermGen в JDK 8 (stackoverflow).
буде
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.