«1. Введение

В этом кратком руководстве мы рассмотрим различия между областями памяти PermGen и Metaspace в среде Java.

Важно иметь в виду, что, начиная с Java 8, Metaspace заменяет PermGen, внося некоторые существенные изменения.

2. PermGen

PermGen (постоянная генерация) — это специальное пространство кучи, отделенное от кучи основной памяти.

JVM отслеживает загруженные метаданные класса в файле PermGen. Кроме того, JVM хранит все статическое содержимое в этом разделе памяти. Сюда входят все статические методы, примитивные переменные и ссылки на статические объекты.

Кроме того, он содержит данные о байт-коде, именах и JIT-информации. До Java 7 пул строк также был частью этой памяти. Недостатки фиксированного размера пула перечислены в нашей статье.

Максимальный размер памяти по умолчанию для 32-разрядной JVM составляет 64 МБ и 82 МБ для 64-разрядной версии.

Однако мы можем изменить размер по умолчанию с помощью параметров JVM:

    -XX:PermSize=[size] — начальный или минимальный размер пространства PermGen -XX:MaxPermSize=[size] — максимальный размер ~ ~~ Самое главное, Oracle полностью удалила это пространство памяти в выпуске JDK 8. Поэтому, если мы используем эти флаги настройки в Java 8 и более новых версиях, мы получим следующие предупреждения:

Из-за ограниченного размера памяти PermGen участвует в генерации знаменитой ошибки OutOfMemoryError. Проще говоря, загрузчики классов не были должным образом собраны мусором, что привело к утечке памяти.

>> java -XX:PermSize=100m -XX:MaxPermSize=200m -version
OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
...

Таким образом, мы получаем ошибку памяти; в основном это происходит в среде разработки при создании новых загрузчиков классов.

3. Metaspace

Проще говоря, Metaspace — это новое пространство памяти, начиная с версии Java 8; он заменил старое пространство памяти PermGen. Наиболее существенная разница заключается в том, как он обрабатывает выделение памяти.

В частности, эта собственная область памяти автоматически увеличивается по умолчанию.

У нас также есть новые флаги для настройки памяти:

MetaspaceSize и MaxMetaspaceSize — мы можем установить верхние границы метапространства. MinMetaspaceFreeRatio — минимальный процент свободной емкости метаданных класса после сборки мусора. MaxMetaspaceFreeRatio — максимальный процент свободной емкости метаданных класса после сборки мусора, чтобы избежать уменьшения объема пространства

    Кроме того, сборка мусора Процесс также получает некоторые преимущества от этого изменения. Сборщик мусора теперь автоматически запускает очистку мертвых классов, как только использование метаданных класса достигает максимального размера метапространства.

Таким образом, с этим улучшением JVM снижает вероятность получения ошибки OutOfMemory.

Несмотря на все эти улучшения, нам по-прежнему необходимо отслеживать и настраивать метапространство, чтобы избежать утечек памяти.

4. Резюме

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

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

«