Навчаючись про профілювання Java-пам'яті, я продовжую бачити термін "простір пермі" на додаток до "купи". Я знаю, що це купа - що таке космос?
Навчаючись про профілювання Java-пам'яті, я продовжую бачити термін "простір пермі" на додаток до "купи". Я знаю, що це купа - що таке космос?
Відповіді:
Це означає постійне покоління :
Постійне покоління є особливим, оскільки воно містить метадані, що описують класи користувачів (класи, які не є частиною мови Java). Прикладами таких метаданих є об'єкти, що описують класи та методи, і вони зберігаються у постійному поколінні. Програми з великою кодовою базою можуть швидко заповнити цей сегмент купи, що спричинить
java.lang.OutOfMemoryError
: PermGen незалежно від того, наскільки високий ваш -Xmx і скільки пам'яті у вас на машині.
Perm space
використовується для збереження інформації для завантажених класів та деяких інших розширених функцій, таких як String Pool
(для високооптимізованого тестування рівності рядків), які зазвичай створюються String.intern()
методами. Оскільки ваша програма (кількість класів) буде рости, цей простір швидко заповнюватиметься, оскільки збір сміття в цьому просторі не є настільки ефективним, щоб очистити його, як потрібно, ви швидко виходите з пам’яті: помилка простору Перм. Після цього жодна програма не запускатиметься на цій машині ефективно навіть після величезної порожньої JVM.
Перед запуском програми вам слід java -XX:MaxPermSize
позбутися цієї помилки.
Perm Gen означає постійне покоління, яке містить інформацію про метадані про класи.
Пермген-простір завжди відомий як область методу. Коли підсистема завантажувача класів завантажує файл класу (байт-код) до області методу (permGen). Він містить усі метадані класу, наприклад: Повністю кваліфіковане ім'я вашого класу, Повністю ім'я безпосереднього батьківського класу, інформація про змінну, інформація про конструктор, інформація про постійний пул тощо.
Те, що існує під PremGen: Класна зона потрапляє під PremGen. Статичні поля також розробляються під час завантаження класу, тому вони також існують у PremGen. Тут зберігається зона постійного басейну з усіма незмінними полями, об’єднаними як String. На додаток до цього, також містяться дані класу, завантажені завантажувачами класів, масиви об'єктів, внутрішні об'єкти, що використовуються jvm.
PermGen Space означає виділення пам'яті для постійного покоління. Усі незмінні об'єкти Java підпадають під цю категорію, наприклад, String
яка створюється за допомогою літералів або String.intern()
методів та для завантаження класів в пам'ять. PermGen Space пришвидшує наш пошук рівності рядків.