[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-jvm-chto-takoe-metaspace-i-chem-on-otlichaetsya-ot-permgen":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":17,"progress":18,"seo":19},1212,"chto-takoe-metaspace-i-chem-on-otlichaetsya-ot-permgen",38,"jvm","JVM","⚙️","Что такое Metaspace и чем он отличается от PermGen","Metaspace — это область памяти JVM (начиная с Java 8, JEP 122), расположенная в native memory за пределами heap, предназначенная для хранения метаданных загруженных классов. Metaspace заменил PermGen, который имел фиксированный размер и часто вызывал `OutOfMemoryError: PermGen space`.\n\n### Сравнение PermGen и Metaspace\n\n| Характеристика | PermGen (Java 7 и ранее) | Metaspace (Java 8+) |\n|---|---|---|\n| Расположение | Внутри heap JVM | В native memory (вне heap) |\n| Размер по умолчанию | Фиксированный (64-256 MB) | Ограничен только доступной памятью ОС |\n| Параметр ограничения | `-XX:MaxPermSize` | `-XX:MaxMetaspaceSize` |\n| Рост | Не растёт автоматически | Динамически расширяется |\n| GC | Собирается при Full GC | Собирается при достижении порога (`-XX:MetaspaceSize`) |\n\n### Что хранится в Metaspace\n\n- Метаданные загруженных классов (структуры Klass)\n- Constant pool (пул констант) классов\n- Аннотации и сигнатуры методов\n- Байт-код методов\n- Данные о виртуальных таблицах методов (vtable, itable)\n\nИнтернированные строки (String intern pool) были перенесены из PermGen в heap ещё в Java 7 (JEP 2495).\n\n### Настройка Metaspace\n\n\u003Cdetails>\n\u003Csummary>Параметры JVM для настройки Metaspace\u003C\u002Fsummary>\n\n```bash\n# Установить начальный порог для запуска GC Metaspace\n-XX:MetaspaceSize=256m\n\n# Установить максимальный размер Metaspace\n-XX:MaxMetaspaceSize=512m\n\n# Минимальное свободное пространство после GC (в процентах)\n-XX:MinMetaspaceFreeRatio=40\n\n# Максимальное свободное пространство после GC (в процентах)\n-XX:MaxMetaspaceFreeRatio=70\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>Мониторинг Metaspace\u003C\u002Fsummary>\n\n```bash\n# Посмотреть использование Metaspace через jstat\njstat -gcmetacapacity \u003Cpid>\n\n# Через jcmd\njcmd \u003Cpid> VM.metaspace\n```\n\n\u003C\u002Fdetails>\n\n### Частые ошибки\n\n- Забывают установить `-XX:MaxMetaspaceSize` в production — при утечке загрузчиков классов процесс может быть убит OOM Killer ОС\n- Путают `MetaspaceSize` (порог для первого GC) с `MaxMetaspaceSize` (жёсткий лимит)\n- Пытаются использовать параметры PermGen (`-XX:MaxPermSize`) на Java 8+ — они игнорируются с предупреждением\n\n> **На собеседовании:** главное отличие — Metaspace живёт в native memory и растёт динамически, а PermGen имел фиксированный размер в heap. Обязательно упомяните, что String intern pool перенесён в heap ещё в Java 7. Частая ловушка — вопрос о том, что будет, если не задать `MaxMetaspaceSize` (ответ: Metaspace может съесть всю память ОС при утечке загрузчиков классов).","","middle",[7,15,16],"memory","performance",[],null,{"title":20,"description":21,"ogTitle":22,"ogDescription":23,"keywords":24,"schemaAnswer":33,"featuredSnippetReady":34},"Что такое Metaspace и чем он отличается от PermGen — Gymterview","Metaspace vs PermGen: расположение в native memory, динамический размер, настройка MaxMetaspaceSize. Что хранится в Metaspace, мониторинг и частые ошибки.","Metaspace vs PermGen в JVM — Gymterview","Сравнение Metaspace и PermGen: расположение, размер, GC. Metaspace в native memory с Java 8, PermGen удалён.",[25,26,27,28,29,30,8,31,32],"Metaspace","PermGen","native memory","MaxMetaspaceSize","метаданные классов","Java 8","память","собеседование","Metaspace — область памяти JVM (с Java 8, JEP 122) в native memory для хранения метаданных классов. Заменил PermGen, который имел фиксированный размер в heap и часто вызывал OutOfMemoryError: PermGen space. Ключевые отличия: Metaspace в native memory (вне heap), динамически расширяется, ограничен только памятью ОС. Настраивается через -XX:MaxMetaspaceSize.",true]