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

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

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

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

3 ответов


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

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

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

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


Пока, Пока PermGen, Привет Metaspace

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

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

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

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

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

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

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


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