В чем разница между Пермгеном и Метапространством?
До Java 7 в памяти JVM существовала область под названием PermGen, где JVM хранил свои классы. В Java 8 он был удален и заменен областью под названием Metaspace.
Каковы наиболее важные различия между Пермгеном и Метапространством?
Единственное различие, которое я знаю, заключается в том, чтоjava.lang.OutOfMemoryError: PermGen space
больше не может быть брошено, а параметр VM MaxPermSize
игнорируется.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
не означает, что проблемы с утечкой загрузчика класса исчезли. Так что, да, вам все равно придется следить за своим потреблением и планировать соответственно, так как утечка в конечном итоге поглотит всю вашу родную память.