Что такое Metaspace в JVM и что он заменил?

«Что такое Metaspace в JVM и что он заменил?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Metaspace — это область памяти в JVM (начиная с Java 8), предназначенная для хранения метаданных классов.

Что он заменил: Metaspace заменил PermGen (Permanent Generation). Это было сделано для решения ключевых проблем PermGen:

Аспект PermGen (до Java 7) Metaspace (Java 8+)
Расположение Часть Heap (кучи) JVM. Нативная (внешняя) память процесса.
Размер Фиксированный, задавался параметрами -XX:PermSize и -XX:MaxPermSize. Динамически растет в пределах, заданных -XX:MaxMetaspaceSize (по умолчанию — неограничен).
Ошибки Частые java.lang.OutOfMemoryError: PermGen space. OutOfMemoryError: Metaspace (возникает реже, при достижении лимита нативной памяти).
Управление Сборка мусора была сложной и не всегда эффективной. Класслоадеры и их классы удаляются сборщиком мусора, когда загрузчик становится недостижимым.

Настройка Metaspace:

# Начальный размер Metaspace
-XX:MetaspaceSize=256m
# Максимальный размер Metaspace (ограничивает рост)
-XX:MaxMetaspaceSize=512m

Что хранится в Metaspace:

  • Структуры классов (Klass структуры).
  • Метод-метаданные (байт-код, имена методов, сигнатуры).
  • Константные пулы (Constant Pool).
  • Аннотации.
  • Оптимизированный код, сгенерированный JIT-компилятором.

Преимущество: Динамическое управление памятью под метаданные устраняет необходимость тонкой настройки размера PermGen и снижает риск OutOfMemoryError из-за переполнения метаданных.