В чем разница между Пермгеном и Метапространством?


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

Каковы наиболее важные различия между Пермгеном и Метапространством?

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

3 ответа:

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

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

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

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

Прощай, PermGen, Привет Metaspace

Пермген был полностью удален.

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

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

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

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

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

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

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