Какая бесплатная реализация JVM имеет лучшую обработку PermGen? - PullRequest
7 голосов
/ 17 июня 2009

Я использую Tomcat6 в Sun JRE6, и каждая пара развертывает, я получаю OutOfMemoryException: PermGen. Я выполнил решения Googling of PermGen и перепробовал множество исправлений. Нет работы. Я прочитал много хорошего о Oracle JRockit и о том, как его распределение PermGen может быть гигантским (по сравнению с 128M у Sun), и хотя это не решает проблему, это позволило бы мне выполнить повторное развертывание 100 раз между исключениями PermGen по сравнению с 2 раз сейчас.

Проблема с JRockit заключается в том, что для его использования в производстве вам необходимо купить WebLogic, который стоит тысячи долларов. Какие есть другие (бесплатные) варианты, которые более щадящие для расширения PermGen? Как работают следующие JVM в этой области?

  • IBM JVM
  • Открыть JDK
  • Blackdown
  • Каффе

... другие

Обновление: Некоторые люди спрашивают, почему я считаю, что PermGen max был 128M. Причина в том, что каждый раз, когда я пытаюсь поднять его выше 128M, моя JVM не может инициализироваться:

[2009-06-18 01:39:44] [info] Error occurred during initialization of VM [2009-06-18 01:39:44] [info] Could not reserve enough space for object heap [2009-06-18 01:39:44] [395 javajni.c] [error] CreateJavaVM Failed

Странно, что не удается зарезервировать место для объекта куча , хотя я не уверен, что это куча "вместо" кучи "."

Я загружаю JVM с начальным объемом 1024 МБ и максимальной кучей 1536 МБ.

Я закрою этот вопрос, так как на него дан ответ, т.е. «переключение бесполезно» и задайте вместо него Почему мой Sun JVM не работает с большими настройками PermGen?

Ответы [ 7 ]

7 голосов
/ 17 июня 2009

Я согласен с Майклом Боргвардтом в том, что вы можете увеличить размер PermGen, я не согласен, что это в первую очередь из-за утечек памяти. Пространство PermGen активно поглощается приложениями, в которых интенсивно используется Reflection. Поэтому, если у вас есть приложение Spring / Hibernate, работающее в Tomcat, будьте готовы значительно увеличить пространство PermGen.

5 голосов
/ 17 июня 2009

Что привело вас к мысли, что JVM от Sun ограничена 128M PermGen? Вы можете установить его свободно с параметром командной строки -XX: MaxPermSize; по умолчанию 64M.

Однако, настоящая причина вашей проблемы - это, вероятно, утечка памяти в вашем приложении, которая не позволяет классам собирать мусор; они могут быть очень тонкими, особенно когда задействованы ClassLoaders, так как все, что требуется, это отдельная ссылка на любой из классов в любом месте. Эта статья описывает проблему подробно, а , эта предлагает способы ее устранения.

3 голосов
/ 18 июня 2009

Изменение JVM не является панацеей. Вы можете получить новые неожиданные проблемы (например, см. статью о запуске приложения под 4 различными JVM).

  • Вы можете иметь утечку класса (например, через загрузчики классов), которая чаще всего происходит при повторном развертывании. Честно говоря, я никогда не видел работающего горячего повторного развертывания на Tomcat (надеюсь, однажды увидимся).
  • У вас могут быть неверные параметры JVM (например, для Sun JDK 6 64 бита -XX: + переключатель UseParNewGC приводит к утечке сегмента памяти PermGen. При добавлении дополнительных ключей: -XX: + UseConcMarkSweepGC -XX: + CMSClassUnloadingEnabled-XX: + CMSPermGenSweepingEnabled ситуация будет решена. Забавно, но я никогда не встречал вышеупомянутую утечку с Sun JDK 6 32 бита). Ссылка на статью «Настройка сборки мусора JVM для производственных развертываний».
  • Ваша порция PermGen может быть недостаточной для загрузки классов и связанной с ними информации (на самом деле это чаще всего происходит после повторного развертывания в Tomcat, старые классы остаются в памяти, а новые загружаются)

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

[ОБНОВЛЕНО]

Полезная статья Как устранить ссылку на загрузчик классов при повторном развертывании приложения.

3 голосов
/ 17 июня 2009

Технически, пул памяти "PermGen" - вещь Sun JVM. Другие JVM не называют это так, но все они имеют идею одного или нескольких пулов памяти без кучи.

Но если у вас есть проблема с permgen в вашей Sun JVM, переход на другую JVM вряд ли что-то решит, он просто проявится под другим именем.

Если несколько перераспределений вызывают ваши проблемы, просто увеличьте PermGen виртуальной машины до больших значений. Мы пробовали JRockit некоторое время назад из-за этой самой проблемы, и она страдает от того же исчерпания перераспределения. Мы вернулись в SUn JVM.

0 голосов
/ 10 марта 2014

IBM 100 JVM не имеет (и не было в 2009 году) permgen. Вы можете прочитать больше о его Generative Concurrent Garbage Collector , который является его GC по умолчанию для Java 7.

Я иногда запускал Eclipse IDE на IBM JVM специально, потому что с моими любимыми плагинами он часто заполнял permgen HotSpot JVM. Конечно, возможно, произошла утечка памяти, которую кто-то должен был исправить, но между тем моя среда IDE не выходила из строя, и я не был занят экспериментированием с другими настройками.

0 голосов
/ 18 июня 2009

Perm gen, вероятно, самая простая память для обработки, я сомневаюсь, что между различными реализациями vm будет большая разница.

Убедитесь, что все те конфиги Tomcat, которые отмечены как отключенные в работе, выключены в работе.

Да, некоторые фреймворки генерируют много классов на лету, но они должны убирать за собой, и, в любом случае, вы можете разместить более нескольких классов в 128 МБ.

Серьезно, если perm gen продолжает расти, то это утечка a должна быть исправлена, хотя, возможно, это не ваша проблема.

0 голосов
/ 17 июня 2009

Я использую JRockit и по-прежнему получаю ошибки PermGen, если не увеличиваю (через -XX: MaxPermSize) память. Я также не могу заставить что-либо работать, чтобы избежать этого (кроме увеличения).

...