Все еще невозможно избавиться от исключений PermgenSpace при повторном развертывании? - PullRequest
2 голосов
/ 11 октября 2010

Это старая проблема, которая у меня всегда была. Я хочу перераспределить в среде разработки. После некоторых развертываний у меня заканчивается permgen, и мне приходится убивать сервер. Несколько лет назад я пытался найти решение проблемы, но обнаружил, что Spring и Hibernate обвиняют друг друга в этой проблеме. Было ли найдено какое-либо решение?

Spring Roo утверждает, что не генерирует классы во время выполнения, так что это не будет проблемой. Это действительно работает, и если да, как я могу настроить свое приложение таким образом?

Я понимаю, что здесь есть два вопроса, но если вы можете ответить на один, этого достаточно:)

Ответы [ 3 ]

5 голосов
/ 11 октября 2010

Насколько я понимаю, типичные утечки памяти PermGen выглядят следующим образом.

  1. Где-то существует доступная ссылка на некоторый объект, класс которого был заменен на горячее развертывание.

  2. Этот объект имеет ссылку на свой дескриптор класса.

  3. Дескриптор класса имеет ссылку на его ClassLoader.

  4. ClassLoader содержит ссылки на дескрипторы классов для всех классов, которые он загрузил.

  5. Каждый дескриптор класса имеет ссылки на фрейм статики классов, его байт-коды, его собственный код и т. Д.

Достаточно одной ссылки на один объект, чтобы вызвать утечку пермгена. Если бы могло быть значение enum, слушатель, который не был незарегистрирован, ...

EDIT

Обычный подход, который используют люди, сталкивающиеся с этой проблемой, - пожать плечами и увеличить размер кучи PermGen. Если вам действительно нужно решить проблему с вашим веб-приложением (ями), то:

  • Посмотрите, как закрывается ваше веб-приложение, убедитесь, что соединения с базой данных / пулы соединений закрыты, все обратные вызовы не зарегистрированы и т. Д.
  • Используйте профилировщик памяти Java для отслеживания утечек памяти PermGen (и других), вызванных повторным развертыванием.
  • Будьте готовы повторить этот процесс, если будут обнаружены новые утечки по мере развития вашего веб-приложения.

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

2 голосов
/ 17 октября 2010

Если вы запускаете ваше приложение под Linux, то запуск этого приложения с IBM JRE решит эту проблему.

0 голосов
/ 11 октября 2010

Есть несколько вещей, которые могут помочь с этим.Spring имеет IntrospectionCleanupListener, который может немного помочь.Если вы загружаете и создаете соединения JDBC в веб-приложении, у вас может быть прослушиватель контекста сервлета, который отменяет регистрацию драйверов, загруженных в приложение.Они помогают, но не полностью решают проблему.

...