До Java 7 в памяти JVM была область под названием PermGen , где JVM хранила свои классы. В Java 8 он был удален и заменен областью под названием Metaspace .
Каковы наиболее важные различия между PermGen и Metaspace?
Единственное различие, которое я знаю, это то, что java.lang.OutOfMemoryError: PermGen space
его больше нельзя выбросить, а параметр виртуальной машины MaxPermSize
игнорируется.
Ответы:
Основное отличие с точки зрения пользователя - которое, я думаю, в предыдущем ответе недостаточно подчеркивает - заключается в том, что 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 .
источник
Пока, пока, PermGen, Hello Metaspace
PermGen был полностью удален.
Сборка мусора Metaspace - сборка мусора мертвых классов и загрузчиков классов запускается, как только использование метаданных класса достигает
MaxMetaspaceSize
.Пространство,
Metadata
которое удерживалось, больше не прилегает кJava heap
,metadata
теперь перемещено в собственную память в область, известную какMetaspace
.Простыми словами ,
Поскольку метаданные класса выделяются из собственной памяти, максимальное доступное пространство - это общая доступная системная память. Таким образом, вы больше не столкнетесь с ними
OOM errors
и можете попасть в область подкачки.Удаление
PermGen
не означает, что проблемы с утечкой загрузчика классов исчезли. Итак, да, вам все равно придется отслеживать свое потребление и планировать его соответствующим образом, поскольку утечка в конечном итоге потребляет всю вашу внутреннюю память.Некоторые другие статьи с анализом: Link1 , Link2 и это
источник
Короче говоря, размер Metaspace автоматически увеличивается в собственной памяти по мере необходимости для загрузки метаданных класса, если не ограничен
-XX:MaxMetaspaceSize
источник