Topjava – онлайн-школа по обучению программированию на самом популярном в мире языке Java

*Открытые вступительные занятия с выполнением домашнего задания
PermGen и Metaspace в среде Java
В этом небольшом руководстве мы рассмотрим разницу между областями памяти PermGen и Metaspace в Java среде. Начиная с Java 8, Metaspace заменил PermGen, привнеся некоторые существенные изменения.
PermGen
PermGen (Permanent Generation) – это специальное место в куче,
отделенное от основной памяти
В PermGen виртуальная машина хранит метаданные загруженных классов. Также здесь находятся всё статическое содержимое приложения, переменные примитивных типов и ссылки на статические объекты.

Более того PermGen хранит данные о байткоде и JIT информацию. До Java 7 пул строк также являлся частью PermGen.

По умолчанию, максимальный размер этой области памяти для 32-х битной JVM равен 64 Мб, а для 64-х битной версии – 82 Мб. Однако, вы можете изменять эти значения, используя следующие параметры JVM:

  • -XX:PermSize=[размер] для установки минимального размера PermGen области

  • -XX:MaxPermSize=[размер] для установки максимального размера

Из-за своего ограниченного размера, PermGen является причиной возникновения ошибки java.lang.OutOfMemoryError: PermGen space. Проще говоря, загрузчики классов не обрабатываются сборщиком мусора должным образом, в результате чего появляются утечки памяти. Чаще всего это происходит при создании новых загрузчиков.

Эта область памяти была полностью удалена в JDK 8.
Metaspace
Metaspace – новая область памяти, появившаяся в 8 версии Java и заменившая устаревшую PermGen. Основное их отличие заключается в способе распределения памяти.
По умолчанию, Metaspace увеличивается автоматически. Однако и здесь у нас есть возможность управления памятью:

  • При помощи MetaspaceSize и MaxMetaspaceSize можно задать границы Metaspace области

  • MinMetaspaceFreeRatio – минимальный зарезервированный размер памяти для метаданных классов после сборки мусора. Выражается в процентах от общего размера Metaspace области

  • MaxMetaspaceFreeRatio – максимальный зарезервированный размер памяти для метаданных классов после сборки мусора. Используется для предотвращения сокращения объема пространства, заполнение которого вызывает сборку мусора. Также выражается в процентах от общего размера Metaspace

В результате появления Metaspace, процесс очистки памяти получил некоторые преимущества. Теперь сборщик мусора автоматически удаляет из памяти ненужные классы, когда емкость, выделенная для хранения метаданных, достигает максимального значения. Вместе с этим, уменьшилась вероятность получения ошибки OutOfMemoryError.

Несмотря на все плюсы, нам все равно необходимо контролировать и, при необходимости, настраивать Metaspace чтобы избежать утечек памяти.
Итоги
В этом кратком руководстве мы познакомились с областями памяти PermGen и Metaspace и описали их основные различия.

PermGen все еще используется в JDK 7 версии и ниже, однако, начиная с JDK 8 эта область памяти была удалена и заменена на Metaspace, которая предлагает более гибкое и надежное использование памяти приложениями.

Источник: Permgen vs Metaspace in Java