Основное отличие с точки зрения пользователя - которое, я думаю, в предыдущем ответе недостаточно подчеркивает - заключается в том, что 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 .