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

118

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

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

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

Kao
источник
первый результат в Google: infoq.com/articles/Java-PERMGEN-Removed
the8472
@ the8472 Да, но этот (и многие другие) результаты Google описывают только механизм Metaspace, не говоря уже о точных различиях между ним и PermGen.
Kao

Ответы:

137

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

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

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

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

Маттиас Джидерхамн
источник
17
Ни Permgen, ни Metaspace не содержат экземпляров класса Class. Они хранят только метаинформацию о загруженных классах. Экземпляры класса Class хранятся в обычной куче, как и экземпляры других классов.
Средний Джо
Хорошее сравнение. Спасибо
Сандип
1
Кстати, OTOH означает «С другой стороны»
sofs1
43

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

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

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

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

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

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

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

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

Анкур Сингхал
источник
6
Вместо MaxPermGen у вас есть MaxMetaspaceSize, поэтому нет причин, по которым он будет использовать больше или меньше памяти или у вас будет меньше контроля.
Питер Лоури
2
о какой памяти мы здесь говорим? RAM-память или HDD-память.
Динеш
1
@Dinesh RAM (внутренняя память)
Адитья Гупта
10

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

Чандрасекаран
источник