Основна відмінність з точки зору користувача - на яку я вважаю, що попередня відповідь недостатньо наголошує - полягає в тому, що Metaspace за замовчуванням автоматично збільшує свій розмір (до того, що забезпечує базова ОС), тоді як PermGen завжди має фіксований максимальний розмір. Ви можете встановити фіксований максимум для Metaspace з параметрами JVM, але ви не можете зробити автоматичне збільшення PermGen.
Значною мірою це лише зміна назви. Коли вперше був представлений PermGen, не було Java EE або динамічного завантаження (не) завантаження, тож колись клас завантажений, він застряг у пам'яті, поки JVM не вимкнувся - таким чином, постійне покоління. На сьогодні класи можуть завантажуватися та вивантажуватися впродовж життя JVM, тому Metaspace має більше сенсу для області, де зберігаються метадані.
Вони містять java.lang.Class
екземпляри, і вони страждають від витоків ClassLoader . Різниця полягає лише в тому, що з налаштуваннями Metaspace за замовчуванням потрібно тривати довше, поки ви не помітите симптоми (оскільки воно автоматично збільшується наскільки це можливо), тобто ви просто відсуньте проблему далі, не вирішуючи її. ОТО Я думаю, що ефект від вичерпання оперативної пам'яті ОС може бути серйознішим, ніж просто вичерпання JVM PermGen, тому я не впевнений, що це значною мірою поліпшення.
Якщо ви використовуєте JVM з PermGen або з Metaspace, якщо ви робите динамічну розвантаження класу, вам слід вжити заходів щодо витоків завантажувача, наприклад, використовуючи мою бібліотеку запобігання витоку ClassLoader .