Основное отличие с точки зрения пользователя - который я думаю, что предыдущий ответ не подчеркнуть, - это то, что Метапространства по умолчанию увеличивается авто его размер (до того, что предоставляет базовая ОС), в то время как PermGen всегда имеет фиксированный максимальный размер. Вы можете установить фиксированный максимум для Metaspace с параметрами JVM, но вы не можете автоматически увеличить PermGen.
В значительной степени это просто смена имени. Назад, когда был введен PermGen, не было загрузки Java EE или динамического класса (un), поэтому, как только класс был загружен, он застрял в памяти до остановки JVM - таким образом Постоянные Поколение. В настоящее время классы могут загружаться и выгружаться в течение срока службы JVM, поэтому Metaspace имеет больше смысла для области, где хранятся метаданные.
Оба они содержат экземпляры java.lang.Class
, и оба они страдают от ClassLoader leaks. Единственное отличие заключается в том, что с настройками по умолчанию в Metaspace это занимает больше времени, пока вы не заметите симптомы (поскольку они автоматически увеличиваются настолько, насколько это возможно), т. Е. Вы просто удаляете проблему дальше, не решая ее. OTOH Я предполагаю, что эффект исчерпания OS-памяти может быть более серьезным, чем просто запуск JVM PermGen, поэтому я не уверен, что это большая часть улучшения.
Независимо от того, используете ли вы JVM с PermGen или с помощью Metaspace, если вы выполняете динамическую разгрузку класса, вам необходимо принять меры против утечек классов, например, используя мой ClassLoader Leak Prevention library.
первых результаты Google: http://www.infoq.com/articles/Java-PERMGEN-Removed – the8472
@ the8472 Да, но это (и многие другие) результаты google описывают только механизм Metaspace, не говоря уже о точных различиях между этим и PermGen. – Kao