Spring 3.1, Hibernate 4, Tiles2, Tomcat 7 - очистка (многократное развертывание вызывает утечки памяти) - PullRequest
0 голосов
/ 11 января 2012

Кажется, у меня проблема с утечкой памяти при использовании Spring, Hibernate и плиток для моего веб-приложения. Я думаю, что это может быть вызвано тем, что мое приложение не самоочищается между развертываниями. Я много разворачиваю и отменяю развертывание, поскольку в настоящее время я только изучаю все эти фреймворки.

Какие вещи я должен делать для очистки моего веб-приложения? В настоящее время я ничего не делаю, потому что я думал, что Java автоматически выполняет очистку памяти, однако я почти уверен, что он не делает все, когда дело доходит до весны, так как tomcat продолжает жаловаться на постоянную память.

Я не понимаю, нужно ли мне запускать определенные методы, чтобы поддерживать чистоту. Я читал о пружинном хуке, который где-то регистрирует приложение, когда он выключается, приложение очищается правильно? Я не был уверен, нужно ли что-то подобное, хотя в новой версии spring (3.1)

Например, tomcat постоянно говорит мне, что я не отменяю регистрацию драйвера JDBC должным образом (однако я думаю, что tomcat делает это автоматически, если он обнаружен).

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 23 января 2012

Hibernate 4.0 представил jboss-logging как зависимость, которая, по-видимому, вызывает утечки permgen (см. https://issues.jboss.org/browse/JBLOGGING-66).

Я не уверен, что можно сделать, чтобы правильно это исправить, но в качестве обходного пути перемещение jboss-logging jar в каталог lib tomcats похоже работает.

1 голос
/ 11 января 2012

В любом случае, как можно дольше, вы должны завершить работу своего рабочего кота перед развертыванием новой версии.(Для этого требовалось иметь двух котов и механизм переключения при отказе, или вы просто соглашаетесь с тем, что служба не работает на одну секунду дольше, чем просто обновление.)

Насколько мне известно, это единственный способ сделатьУверен, что утечка памяти (также учтите, что perm gen) не принесет вреда.

0 голосов
/ 11 января 2012

Это похоже на проблемы в проектах, где я использовал Hibernate.

Hibernate генерирует прокси для каждого объекта домена, который вы используете.Эти прокси хранятся в пространстве постоянного поколения, и они не очищаются при перезапуске / повторном развертывании приложения.Объем памяти, используемой пространством PermGen, по умолчанию относительно невелик, поэтому вы можете попытаться увеличить его с помощью параметра -XX: MaxPermSize java.Это может улучшить время, прежде чем вы получите ошибку памяти, но я не знаю полного решения этой проблемы.В конечном итоге вам придется перезапустить tomcat it self.

Для проблемы jdbc, во-первых, если вы вручную используете соединение, убедитесь, что оно правильно закрыто в блоке try catch catch.Если вы не используете объект подключения таким образом, он может быть снова связан с Hibernate.

...