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»
Оцените статью, если она вам понравилась!