Ошибка при горячем развертывании в JBoss
Я работаю в проекте Java/J2EE с JBoss в качестве сервера приложений.
Мы строим нашу войну и делаем горячее развертывание на сервере, используя Jenkins. Иногда в JBoss выдается ошибка Out of Memory.
Интересно, отвечает ли за это горячее развертывание? Кроме того, хотелось бы знать, есть ли у горячего развертывания какие-либо подводные камни по сравнению с обычным ручным развертыванием с остановом.
Может ли кто-нибудь предоставить какие-либо ценные материалы?
3 ответа
Я согласен с ответами о настройке пространства кучи /permgen, хотя трудно быть конкретным без дополнительной информации о том, сколько памяти разрешено, что вы используете и т. Д.
Кроме того, хотелось бы знать, есть ли у горячего развертывания какие-либо подводные камни по сравнению с обычным развертыванием с запуском и остановкой вручную.
Когда вы вручную запускаете и останавливаете службу между развертываниями, вы можете быть немного неаккуратными в отношении очистки вашего веб-приложения - и никто никогда не узнает.
При оперативном развертывании предыдущий экземпляр контекста вашего сервлета уничтожается. Чтобы уменьшить частоту исключений OutOfMemory, вы должны убедиться, что когда это происходит, вы убираете за собой. Несмотря на то, что вы ничего не можете сделать с проблемами памяти PerloGen загрузчика классов, вы не хотите усугублять проблему, вводя дополнительные утечки памяти.
Например, если ваш файл war запускает какие-либо рабочие потоки, их необходимо остановить. Если вы связываете объект в JNDI, объект должен быть свободным. При наличии открытых файлов, подключений к базе данных и т. Д. Они должны быть закрыты.
Если вы используете веб-фреймворк, такой как Spring - большая часть этого уже решена. Spring регистрирует ServletContextListener, который автоматически останавливает контейнер при разрушении контекста сервлета. Однако вам все равно нужно убедиться, что любые компоненты, которые создают ресурсы во время init
очистит эти ресурсы во время destroy
,
Если вы делаете ручной сервлет, то вам нужно зарегистрировать реализацию ServletContextListener в вашем файле web.xml и в реализации contextDestroyed
убирать любые ресурсы.
Кстати, вы должны включить точное исключение OutOfMemory в ваш ответ. Если это говорит что-то вроде java.lang.OutOfMemoryError: PermGen space
тогда это, вероятно, проблема экземпляров классов, и вы мало что можете сделать. Если это java.lang.OutOfMemoryError: Java heap space
тогда, возможно, это память в вашем приложении, которая не очищается
Горячее развертывание не очищает ранее загруженные экземпляры Class в Perm Gen. Он загружает экземпляры Class заново. Небольшой гугл указал мне обратно на SO. Что делает горячее развертывание "сложной проблемой"?
Вы должны увеличить пространство кучи, особенно Пермское пространство
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-XX:MaxPermSize set maximum Permanent generation size
Вы можете установить его в JAVA_OPTS
в твоем jboss run.sh
или же run.bat
лайк:
-Xms256m -Xmx1024m -XX:MaxPermSize=512m