Permgen против Metaspace в Java

Пермген против Metaspace в Java

1. Вступление

В этом кратком руководствеwe’re going to examine the differences between the PermGen and Metaspace memory regions в среде Java.

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

2. PermGen

PermGen (Permanent Generation) is a special heap space separated from the main memory heap.

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

Кроме того,it contains data about bytecode, names and JIT information. До Java 7 String Pool также был частью этой памяти. Недостатки фиксированного размера пула перечислены в нашемwrite-up.

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

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

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

  • -XX:MaxPermSize=[size] - максимальный размер

Что наиболее важно, Oracle полностью удалила это пространство памяти в выпуске JDK 8.

With its limited memory size, PermGen is involved in generating the famous OutOfMemoryError. Проще говоря,class loaders неправильно собирают мусор и, как следствие, вызывают утечку памяти.

Следовательно, мы получаемmemory space error; это происходит в основном в среде разработки при создании новых загрузчиков классов.

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

Проще говоря, Metaspace - это новое пространство памяти - начиная с версии Java 8; it has replaced the older PermGen memory space. Наиболее существенным отличием является то, как оно обрабатывает распределение памяти.

В результатеthis native memory region grows automatically by default. Здесь у нас также есть новые флаги для настройки памяти:

  • MetaspaceSize иMaxMetaspaceSize – мы можем установить верхние границы Metaspace.

  • MinMetaspaceFreeRatio –  - минимальный процент свободной емкости метаданных класса послеgarbage collection

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

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

Следовательно,with this improvement, JVM reduces the chance to get the OutOfMemory error.

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

4. Резюме

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

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