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

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

Bye, Bye PermGen, Hello Metaspace

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

С другой стороны, "метапространство, как следует из названия, является пространством для метаданных". Я думаю, что его легче понять.