Ответ
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 из-за переполнения метаданных.