Вопрос по jvm, java – Какая бесплатная реализация JVM имеет лучшую обработку PermGen?

7

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

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

  • IBM JVM
  • Open JDK
  • Blackdown
  • Kaffe

... другие?

Update: Некоторые люди спрашивают, почему я думал, что максимальный PermGen был 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

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

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

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

Ваш Ответ

7   ответов
3

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

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

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

Error: User Rate Limit Exceeded Robert Campbell
0

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

Error: User Rate Limit Exceeded
0

IBM JVM не имеет (и не было в 2009 году) пермгена. Вы можете прочитать больше о егоПараллельный сборщик мусора который является его GC по умолчанию для Java 7.

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

3

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

You can have a class leak (e.g. via classloaders) that mostly often happen on redeploy. Frankly, I've never saw working hot redeploy on Tomcat (hope to see one day). You can have incorrect JVM paramaters (e.g. for Sun JDK 6 64 bits -XX:+UseParNewGC switch leads to leak PermGen segment of memory. If you add additional switches: -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled-XX:+CMSPermGenSweepingEnabled the situation will be resolved. Funny, but I never met above mentioned leak with Sun JDK 6 32 bits). Link to an article "Tuning JVM Garbage Collection for Production Deployments". Your PermGen chunk can be not enough to load classes and related information (actually that most often happens after redeploy under Tomcat, old classes stay in memory and new ones are loading)

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

[UPDATED]

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

Error: User Rate Limit Exceeded Robert Campbell
Error: User Rate Limit Exceededspringsource.org/dmserver
7

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

Error: User Rate Limit Exceeded Robert Campbell
Error: User Rate Limit Exceeded
5

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

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

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

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

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

Похожие вопросы