Перейти к основному содержимому

Permgen против Metaspace в Java

· 3 мин. чтения

1. Введение

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

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

2. ПермГен

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

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

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

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

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

  • -XX:PermSize=[размер] — начальный или минимальный размер пространства PermGen.
  • -XX:MaxPermSize=[размер] — максимальный размер

Что наиболее важно, Oracle полностью удалила это пространство памяти в выпуске JDK 8. Поэтому, если мы используем эти флаги настройки в Java 8 и более новых версиях, мы получим следующие предупреждения:

>> 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
...

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

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

3. Метапространство

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

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

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

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

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

Поэтому с этим улучшением JVM снижает шанс получить ошибку OutOfMemory .

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

4. Резюме

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

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