Здравствуйте, inopressa, Вы писали:
I>работаю с Томкатом из под Идеи. Проект на JSF. Регулярно (после нескольких деплоев) вываливается с OutOfMemoryException. PemGemSpace error.
I>Памяти добавил, вываливаться стало чуть реже. Куда копать?
PemGemSpace — специальная область памяти отвечающая за хранение классов. Когда ты делаешь undeploy, некоторые классы твоего приложения могут не выгружаться class loader-ом. Смотри профайлером, какие именно классы не выгружаются. Например, такая проблема может возникать при использовании commons-logging.
Как вариант решения проблемы, использовать class loader сервера вместо class loader-а приложения. Подробности смотри в доке на Томкэт.
Здравствуйте, AVM, Вы писали:
AVM>Здравствуйте, inopressa, Вы писали:
I>>работаю с Томкатом из под Идеи. Проект на JSF. Регулярно (после нескольких деплоев) вываливается с OutOfMemoryException. PemGemSpace error.
I>>Памяти добавил, вываливаться стало чуть реже. Куда копать? AVM>PemGemSpace — специальная область памяти отвечающая за хранение классов. Когда ты делаешь undeploy, некоторые классы твоего приложения могут не выгружаться class loader-ом. Смотри профайлером, какие именно классы не выгружаются. Например, такая проблема может возникать при использовании commons-logging. AVM>Как вариант решения проблемы, использовать class loader сервера вместо class loader-а приложения. Подробности смотри в доке на Томкэт.
Объяснение неправильное. Да и вопрос тоже. На фига использовать IDEA, непонятно. Хотя проблема не имеет отношения к IDEA.
В общем, не хватает размера области памяти PermGen. Решение:
— увеличить его. Поиском в google по слову PermGen можно найти рецепты, в частности подходящий: настройка PermGen
Что такое PermGen — см. в документации по JVM.
Посмотреть, сколько памяти сейчас используется в PermGen, можно программой jconsole и др.
— использовать JVM, в которой нету PermGen, а именно Oracle JRockit (ранее BEA JRockit).
Здравствуйте, Partisan, Вы писали:
P>Здравствуйте, AVM, Вы писали:
AVM>>Здравствуйте, inopressa, Вы писали:
I>>>работаю с Томкатом из под Идеи. Проект на JSF. Регулярно (после нескольких деплоев) вываливается с OutOfMemoryException. PemGemSpace error.
I>>>Памяти добавил, вываливаться стало чуть реже. Куда копать? AVM>>PemGemSpace — специальная область памяти отвечающая за хранение классов. Когда ты делаешь undeploy, некоторые классы твоего приложения могут не выгружаться class loader-ом. Смотри профайлером, какие именно классы не выгружаются. Например, такая проблема может возникать при использовании commons-logging. AVM>>Как вариант решения проблемы, использовать class loader сервера вместо class loader-а приложения. Подробности смотри в доке на Томкэт.
P>Объяснение неправильное. Да и вопрос тоже. На фига использовать IDEA, непонятно. Хотя проблема не имеет отношения к IDEA. P>В общем, не хватает размера области памяти PermGen. Решение: P>- увеличить его. Поиском в google по слову PermGen можно найти рецепты, в частности подходящий: P>настройка PermGen P>Что такое PermGen — см. в документации по JVM. P>Посмотреть, сколько памяти сейчас используется в PermGen, можно программой jconsole и др. P>- использовать JVM, в которой нету PermGen, а именно Oracle JRockit (ранее BEA JRockit).
Увеличение размера perm gen просто отстрочит вылет с out of memory, но не решит проблему. Надо внимательно смотреть какие классы не выгружаются после undeploy приложения.
Здравствуйте, AVM, Вы писали:
AVM>Увеличение размера perm gen просто отстрочит вылет с out of memory, но не решит проблему. Надо внимательно смотреть какие классы не выгружаются после undeploy приложения.
Увеличение размера (параметр -XX:MaxPermSize) сделает такие ситуации значительно реже, что само может решить проблему. Другие параметры, рекомендуемые в указанной мной статье, заставляют PermGen охватываться действием GC. Вообще-то я сам их не применял, но одно MaxPermSize помогало, и кроме того, я иногда пользовался, в основном для отладки, BEA JRockit (на который обратил внимание после того как увидел эту ошибку OutOfMemoryError).
Какие классы не выгружаются — тоже можно посмотреть (вдруг это следствие ошибки в программе), но может оказаться, что с этим ничего сделать нельзя, потому что переполнение области PermGen может быть и без ошибок.
Действительно не всегда можно избавиться от невыгружаемых классов, тогда можно попробовать потюнинговать java. Например можно глянуть здесь: http://java.sun.com/docs/performance/
Также есть простое и работающее решение от разработчиков SeamFramework (далее идут параметры для запуска виртуальной машины):
-Xms128m
-Xmx512m
-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000
-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=512m
-Xverify:none
Здравствуйте, inopressa, Вы писали:
I>работаю с Томкатом из под Идеи. Проект на JSF. Регулярно (после нескольких деплоев) вываливается с OutOfMemoryException. PemGemSpace error.
I>Памяти добавил, вываливаться стало чуть реже. Куда копать?
Не выгружаются классы JSF — проходили, решения не нашли. Так что увеличивай пермген и перезагружай томкат время от времени.
Здравствуйте, inopressa, Вы писали:
I>работаю с Томкатом из под Идеи. Проект на JSF. Регулярно (после нескольких деплоев) вываливается с OutOfMemoryException. PemGemSpace error. I>Памяти добавил, вываливаться стало чуть реже. Куда копать?
Мне ещё не удалось увидеть хотя бы один opensource J2EE сервер\контейнер, который бы не имел проблемы с редеплоем на горячую. И, на сколько я знаю, у томката с этим хуже всего. Так что единственный вариант это полностью перезапускать JVM/Томкат.
B>Мне ещё не удалось увидеть хотя бы один opensource J2EE сервер\контейнер, который бы не имел проблемы с редеплоем на горячую. И, на сколько я знаю, у томката с этим хуже всего. Так что единственный вариант это полностью перезапускать JVM/Томкат.
Другие варианты уже описали. В частности, использование JRockit полностью устраняет ошибку OutOfMemoryError ввиду отсутствия PermGen. Ошибка действительно обычно возникает при отладке (то есть при многократных запусках и остановках приложения).
Здравствуйте, Partisan, Вы писали:
P>Другие варианты уже описали. В частности, использование JRockit полностью устраняет ошибку OutOfMemoryError ввиду отсутствия PermGen. Ошибка действительно обычно возникает при отладке (то есть при многократных запусках и остановках приложения).
Ох, я сильно, сомневаюсь, что отсутствие PermGen решает проблему. У меня IBM JVM, тоже без PermGen. Но после десятка редеплоев все равно перестаёт деплоить вообще. Только вместо понятного OutOfMemoryError:PermGen имеем какое-нибудеь идиотское внутреннее исключение сервера. Проблема никуда не исчезла, просто видоизменилась.
Здравствуйте, GarryIV, Вы писали:
GIV>Не выгружаются классы JSF — проходили, решения не нашли. Так что увеличивай пермген и перезагружай томкат время от времени.
Не только, мы вообще не используем JSF, но такая ошибка есть.
Кстати, заметил, что при одинаковых настройках томката в ИДЕА и отдельного томката, последний падает гораздо реже.
Здравствуйте, inopressa, Вы писали:
I>работаю с Томкатом из под Идеи. Проект на JSF. Регулярно (после нескольких деплоев) вываливается с OutOfMemoryException. PemGemSpace error.
I>Памяти добавил, вываливаться стало чуть реже. Куда копать?