2014-11-25 4 views
69

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

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

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

+0

первых результаты Google: http://www.infoq.com/articles/Java-PERMGEN-Removed – the8472

+0

@ the8472 Да, но это (и многие другие) результаты google описывают только механизм Metaspace, не говоря уже о точных различиях между этим и PermGen. – Kao

ответ

77

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

+3

Ни Permgen, ни Metaspace не содержат экземпляров класса Class. Они содержат только метаинформацию о загруженных классах. Экземпляры класса Class хранятся в обычной куче, как и в других классах. –

+0

Хорошее сравнение. благодаря – Sandeep

23

Bye, Bye PermGen, Здравствуйте Метапространство

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

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

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

В простых словах,

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

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

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

+6

Вместо MaxPermGen у вас есть MaxMetaspaceSize, поэтому нет причин, по которым он будет использовать больше или меньше памяти или у вас меньше контроля. –

5

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