it-swarm.com.ru

В чем разница между PermGen и Metaspace?

До Java 7 в памяти JVM существовала область PermGen , где JVM использовала для хранения своих классов. В Java 8 он был удален и заменен областью, называемой Metaspace .

Каковы наиболее важные различия между PermGen и Metaspace?

Единственное различие, которое я знаю, состоит в том, что Java.lang.OutOfMemoryError: PermGen space больше нельзя выбрасывать, а параметр VM MaxPermSize игнорируется.

102
Kao

Основное отличие с точки зрения пользователя - которое, как мне кажется, в предыдущем ответе недостаточно подчеркивает, - это то, что Metaspace по умолчанию автоматически увеличивает свой размер (до чего базовая ОС обеспечивает), в то время как PermGen всегда имеет фиксированный максимальный размер. Вы можете установить фиксированный максимум для Metaspace с параметрами JVM, но вы не можете настроить PermGen автоматически.

В значительной степени это просто смена имени. Назад, когда был представлен PermGen, не было Java EE или загрузки динамического класса (не), поэтому, как только класс был загружен, он застрял в памяти, пока JVM не закрылась - таким образом Постоянное поколение. В настоящее время классы могут загружаться и выгружаться в течение срока службы JVM, поэтому Metaspace имеет больше смысла для области, где хранятся метаданные.

Оба они содержат экземпляры Java.lang.Class, и оба они страдают от утечки ClassLoader . Единственное отличие состоит в том, что с настройками Metaspace по умолчанию требуется больше времени, пока вы не заметите симптомы (так как они автоматически увеличиваются настолько, насколько это возможно), т.е. вы просто оттолкнете проблему дальше, не решая ее. OTOH Я думаю, что эффект нехватки памяти ОС может быть более серьезным, чем просто нехватка JVM PermGen, поэтому я не уверен, что это значительное улучшение.

Независимо от того, используете ли вы JVM с PermGen или с Metaspace, если вы выполняете динамическую выгрузку классов, вы должны принять меры против утечек из загрузчика классов, например, используя my библиотека ClassLoader Leak Prevention .

121
Mattias Jiderhamn

Пока, пока, PermGen, Hello Metaspace

PermGen был полностью удален.

Сбор мусора в метапространстве - Сборка мусора мертвых классов и загрузчиков классов запускается, когда использование метаданных класса достигает MaxMetaspaceSize.

Пространство Metadata больше не является смежным с Java heap, metadata теперь перемещено в собственную память в область, известную как Metaspace.

Простыми словами ,

Поскольку метаданные класса выделяются из собственной памяти, максимально доступное пространство - это общая доступная системная память. Таким образом, вы больше не столкнетесь с OOM errors и можете в конечном итоге вылиться в пространство подкачки.

Удаление PermGen не означает, что проблемы утечки из загрузчика классов устранены. Так что, да, вам все равно придется следить за своим потреблением и планировать соответственно, так как утечка в конечном итоге потребляет всю вашу собственную память.

Некоторые другие статьи с анализом: Link1 , Link2 и this

34
Ankur Singhal

Короче говоря, размер метапространства автоматически увеличивается в собственной памяти, как требуется для загрузки метаданных класса, если он не ограничен -XX:MaxMetaspaceSize

9
Chandrasekaran