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



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



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



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

539   3  

3 ответов:

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

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

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

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

Тю, Тю PermGen, Привет Metaspace

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

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

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

простыми словами,

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

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

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

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

Comments

    Ничего не найдено.