Чим відрізняється PermGen від Metaspace?


118

До Java 7 існувала область пам'яті JVM під назвою PermGen , де JVM використовував для збереження своїх класів. У Java 8 її видалили та замінили область, яка називається Metaspace .

Які найбільш важливі відмінності між PermGen та Metaspace?

Єдине, що я знаю, - це те, що java.lang.OutOfMemoryError: PermGen spaceбільше не можна кидати, а параметр VM MaxPermSizeігнорується.


перший результат google: infoq.com/articles/Java-PERMGEN-Removed
the8472

@ the8472 Так, але цей (та багато інших) результати Google описують лише механізм Metaspace, не згадуючи нічого про точні відмінності між цим та PermGen.
Као

Відповіді:


137

Основна відмінність з точки зору користувача - на яку я вважаю, що попередня відповідь недостатньо наголошує - полягає в тому, що Metaspace за замовчуванням автоматично збільшує свій розмір (до того, що забезпечує базова ОС), тоді як PermGen завжди має фіксований максимальний розмір. Ви можете встановити фіксований максимум для Metaspace з параметрами JVM, але ви не можете зробити автоматичне збільшення PermGen.

Значною мірою це лише зміна назви. Коли вперше був представлений PermGen, не було Java EE або динамічного завантаження (не) завантаження, тож колись клас завантажений, він застряг у пам'яті, поки JVM не вимкнувся - таким чином, постійне покоління. На сьогодні класи можуть завантажуватися та вивантажуватися впродовж життя JVM, тому Metaspace має більше сенсу для області, де зберігаються метадані.

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

Якщо ви використовуєте JVM з PermGen або з Metaspace, якщо ви робите динамічну розвантаження класу, вам слід вжити заходів щодо витоків завантажувача, наприклад, використовуючи мою бібліотеку запобігання витоку ClassLoader .


17
Ні Permgen, ні Metaspace не містять екземплярів класу Class. Вони зберігають лише метаінформацію про завантажені класи. Примірники класу Class зберігаються у звичайній купі, як і примірники інших класів.
Середній Джо

Приємне порівняння. Спасибі
Сандіп

1
До речі, OTOH означає "З іншого боку"
sofs1

43

До побачення, до побачення PermGen, привіт Metaspace

PermGen повністю видалено.

Збір сміття в метапросторі - збір сміття мертвих класів та завантажувачів класів запускається, коли використання метаданих класу досягає MaxMetaspaceSize.

Простір, що Metadataвідбувся, вже не суміжний з Java heap, metadataтепер перейшов до рідної пам'яті до області, відомої як Metaspace.

Простими словами ,

Оскільки метадані класу розподіляються з рідної пам'яті, макс доступного простору - це загальна доступна системна пам'ять. Таким чином, ви більше не зіткнетесь, OOM errorsі в кінцевому підсумку ви можете перекинутись у простір своп.

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

Деякі інші статті з аналізом: Link1 , Link2 та це


6
Замість MaxPermGen у вас є MaxMetaspaceSize, тому немає жодної причини, що він буде використовувати більше, або менше пам'яті, або у вас менше контролю.
Пітер Лоурі

2
про яку пам’ять ми говоримо тут? Оперативна пам’ять або пам'ять жорсткого диска.
Дінеш

1
@Dinesh RAM (внутрішня пам'ять)
Aditya Gupta

10

Коротше кажучи, автоматичний розмір метапростору збільшується у власній пам'яті, як потрібно для завантаження метаданих класу, якщо не обмежується -XX:MaxMetaspaceSize

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