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

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

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

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

5 ответов

Решение

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

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

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

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

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

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

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

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

Проще говоря,

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

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

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

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

PermGen

  • (Постоянное поколение) - это специальное пространство кучи, отделенное от основной памяти.
  • JVM отслеживает метаданные класса в PermGen. Кроме того, JVM хранит в нем все статическое содержимое.
  • Из-за ограниченного размера памяти PermGen может выдать OutOfMemoryError.

Метапространство

  • Metaspace - это новое пространство памяти.
  • Он заменил старую память PermGen.
  • Теперь он может обрабатывать выделение памяти.
  • По умолчанию Metaspace увеличивается автоматически.

Вот для упрощения.

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

Другие вопросы по тегам