Що таке простір для завивки?


88

Навчаючись про профілювання Java-пам'яті, я продовжую бачити термін "простір пермі" на додаток до "купи". Я знаю, що це купа - що таке космос?


13
Java 8 повністю вилучила цю концепцію і перейшла в Metaspace
pramodc84,

2
Посилання добре пояснено тут youtube.com/watch?v=PUUJ4rNpRhU
shareef

Відповіді:


103

Це означає постійне покоління :

Постійне покоління є особливим, оскільки воно містить метадані, що описують класи користувачів (класи, які не є частиною мови Java). Прикладами таких метаданих є об'єкти, що описують класи та методи, і вони зберігаються у постійному поколінні. Програми з великою кодовою базою можуть швидко заповнити цей сегмент купи, що спричинить java.lang.OutOfMemoryError: PermGen незалежно від того, наскільки високий ваш -Xmx і скільки пам'яті у вас на машині.


Ендрю, мені просто цікаво дізнатись, який може бути розмір PerGen?
gks

Просто цікаво, чи пермген є частиною пам'яті купи (як зазначено у цій відповіді), або вона не є купою (як зазначено у цій відповіді - stackoverflow.com/a/31103100/3061686 ).
akki

25

Perm spaceвикористовується для збереження інформації для завантажених класів та деяких інших розширених функцій, таких як String Pool(для високооптимізованого тестування рівності рядків), які зазвичай створюються String.intern()методами. Оскільки ваша програма (кількість класів) буде рости, цей простір швидко заповнюватиметься, оскільки збір сміття в цьому просторі не є настільки ефективним, щоб очистити його, як потрібно, ви швидко виходите з пам’яті: помилка простору Перм. Після цього жодна програма не запускатиметься на цій машині ефективно навіть після величезної порожньої JVM.

Перед запуском програми вам слід java -XX:MaxPermSizeпозбутися цієї помилки.


Струнний пул переміщується в кучевий простір з яви 7.
Кофеїн-кодер,

20

Проста (і спрощена) відповідь: тут jvm зберігає власні дані бухгалтерії, на відміну від ваших даних.


17

Perm Gen означає постійне покоління, яке містить інформацію про метадані про класи.

  1. Припустимо, якщо ви створите ім'я класу A, його змінна екземпляра буде зберігатися в купі пам'яті, а клас A разом зі статичними завантажувачами класів зберігатиметься в постійній генерації.
  2. Збирачам сміття буде важко очистити або звільнити простір пам’яті, що зберігається в пам’яті постійного покоління. Тому завжди рекомендується дотримуватися налаштувань пермгенної пам’яті на бажаному рівні.
  3. JAVA8 представив концепцію, яка називається генерацією метапростору, отже, permgen більше не потрібен, коли ви використовуєте версії jdk 1.8.

5

Пермген-простір - це область купи, що містить усі відображувальні дані самої віртуальної машини, такі як об'єкти класу та методу.


3

Він містить такі речі, як визначення класів, пул рядків тощо. Я думаю, ви могли б назвати це метаданими.


3

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


2

Те, що існує під PremGen: Класна зона потрапляє під PremGen. Статичні поля також розробляються під час завантаження класу, тому вони також існують у PremGen. Тут зберігається зона постійного басейну з усіма незмінними полями, об’єднаними як String. На додаток до цього, також містяться дані класу, завантажені завантажувачами класів, масиви об'єктів, внутрішні об'єкти, що використовуються jvm.


1

PermGen Space означає виділення пам'яті для постійного покоління. Усі незмінні об'єкти Java підпадають під цю категорію, наприклад, Stringяка створюється за допомогою літералів або String.intern()методів та для завантаження класів в пам'ять. PermGen Space пришвидшує наш пошук рівності рядків.


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

введіть тут опис зображення

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