Permgen срещу Metaspace в Java

1. Въведение

В този бърз урок ще разгледаме разликите между регионите с памет PermGen и Metaspace в Java среда.

Важно е да се има предвид, че, започвайки с Java 8, Metaspace замества PermGen - внасяйки някои съществени промени.

2. PermGen

PermGen (Permanent Generation) е специално пространство за купчина, отделено от купчината на основната памет .

JVM проследява заредените метаданни на класа в PermGen. Освен това JVM съхранява цялото статично съдържание в този раздел с памет. Това включва всички статични методи, примитивни променливи и препратки към статичните обекти.

Освен това, той съдържа данни за байт код, имена и информация за JIT . Преди Java 7, String Pool също беше част от тази памет. Недостатъците на фиксирания размер на пула са изброени в нашата справка.

Максималният размер на паметта по подразбиране за 32-битова JVM е 64 MB и 82 MB за 64-битовата версия.

Въпреки това можем да променим размера по подразбиране с опциите на JVM:

  • -XX: PermSize = [размер] е началният или минималният размер на пространството PermGen
  • -XX: MaxPermSize = [размер] е максималният размер

Най-важното е, че Oracle напълно премахна това място в паметта в изданието JDK 8. Следователно, ако използваме тези флагове за настройка в Java 8 и по-нови версии, ще получим следните предупреждения:

>> java -XX:PermSize=100m -XX:MaxPermSize=200m -version OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0 OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0 ...

Със своя ограничен размер на паметта, PermGen участва в генерирането на известния OutOfMemoryError . Най-просто казано, зареждачите на класове не са събрани правилно боклук и в резултат генерират изтичане на памет.

Следователно получаваме грешка в паметта; това се случва най-вече в средата за разработка, докато се създават нови клас товарачи.

3. Метапространство

Просто казано, Metaspace е ново пространство в паметта - започвайки от версията на Java 8; той замени по-старото пространство на паметта PermGen . Най-съществената разлика е как се справя с разпределението на паметта.

По-конкретно, този регион на родната памет се увеличава автоматично по подразбиране .

Имаме и нови знамена за настройка на паметта:

  • MetaspaceSize и MaxMetaspaceSize - можем да зададем горните граници на Metaspace.
  • MinMetaspaceFreeRatio - е минималният процент на свободен капацитет на метаданните на класа след събирането на боклука
  • MaxMetaspaceFreeRatio - е максималният процент на свободен капацитет на метаданни на класа след събиране на боклука, за да се избегне намаляване на количеството пространство

Освен това процесът на събиране на боклука също носи някои ползи от тази промяна. Събирачът на боклук сега автоматично задейства почистването на мъртвите класове, след като използването на метаданните на класа достигне максималния си размер на метапространството.

Следователно, с това подобрение JVM намалява шанса да получи грешка OutOfMemory .

Въпреки всички тези подобрения, все още трябва да наблюдаваме и настройваме метапространството, за да избегнем изтичане на памет.

4. Обобщение

В това кратко описание ние представихме кратко описание на регионите с памет PermGen и Metaspace. Освен това обяснихме основните разлики между всеки от тях.

PermGen все още съществува с JDK 7 и по-стари версии, но Metaspace предлага по-гъвкаво и надеждно използване на паметта за нашите приложения.