Рубрики
Без рубрики

Permgen vs Metaspace в Java

Узнайте о различиях между областями памяти PermGen и Metaspace в Java

Автор оригинала: baeldung.

1. введение

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

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

2. ПермГен

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

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

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

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

Однако мы можем изменить размер по умолчанию с помощью параметров 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 – мы можем установить верхние границы метапространства.
  • MinMetaspaceFreeRatio – является минимальным процентом емкости метаданных класса, свободной после сборки мусора
  • MaxMetaspaceFreeRatio – это максимальный процент свободной емкости метаданных класса после сборки мусора, чтобы избежать сокращения объема пространства

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

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

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

4. Резюме

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

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