2016-01-26 3 views
2

Наша команда уже почти год работает с Grails (версия 2.3.5), а команда доставки, управляющая нашими серверами, практически не имеет опыта работы с приложениями, написанными на Grails.«OutOfMemoryError: PermGen space» с Grails webapps

У нас есть несколько экземпляров Tomcat 7, как в тестовой, так и в производственной среде, с определенным количеством веб-приложений. Хотя некоторые экземпляры, содержащие только webapps, разработанные на Java (w/Spring, Hibernate), иногда выходят на что-то вроде 20 контекстов без серьезной проблемы, похоже, что все шесть приложений Grails (приложения, очень похожие на их Java-аналоги) запускаются регулярно вызывая страшную проблему пространства PermGen.

В настоящее время PermGen выделяет 536 МБ, и команда доставки явно предлагает либо использовать отдельный экземпляр для новых приложений, либо увеличить выделенную память; в то же время они убеждают нас проверить, как эти несколько приложений насыщают память.

Наше впечатление заключается в том, что это нормально с приложениями Grails, но у нас нет какого-либо старшего разработчика Grails, у нас нет возможности подтвердить это из опыта или лучшего знания. Является ли 536Mb слишком маленьким выделенным пространством в PermGen для 8 "обычных" веб-страниц Grails?

Обновление: Чтобы указать, что я имею в виду под «регулярным», это все пары интерфейсных интерфейсов + back-end для разных служб, где у интерфейсного интерфейса нет ничего гораздо большего, чем список запросов, мастер переходить от нуля к завершенному запросу, проверять данные, сохраняет их, вызывает веб-сервис, чтобы получить номер протокола, а в нескольких случаях вызывает внешний шлюз оплаты. Внутренний сервер используется для управления запросами и выполняет аналогичные операции.

У каждого приложения может быть около 20 объектов с соответствующими контроллерами, службами и представлениями, а кроме того, у нас есть несколько классов для обработки безопасности w/Spring Security и внешней инфраструктуры.

+1

«Обычное» приложение для приложения Grails довольно субъективно. Что вы используете для своего уровня персистентности в приложениях Java/Spring? Какую версию Grails вы используете? Я ожидал бы, что 536Mb будет низким для вашей настройки. Вы загрузили протестированные приложения Grails до отказа? В какой момент можно подняться вверх? – vector

+2

Возможно, вы загружаете файлы gsp, которые слишком велики для sitemesh, чтобы правильно разобрать и, следовательно, ошибку из памяти. –

+0

Измените вопрос, чтобы добавить несколько деталей. Однако мы не тестировали приложения. –

ответ

2

Так оно и есть. У вас есть в основном два варианта.

  1. Migrate на Java 8 (см http://www.infoq.com/articles/Java-PERMGEN-Removed)
  2. увеличить пространство PermGen дальше.

И быстрый фон. В отличие от обычной Java с Spring, Groovy и Grails генерируют довольно много классов во время выполнения (например, GSP). Groovy также генерирует огромное количество классов - каждое закрытие - это класс. Все это оказало давление на пермг.

Чтобы соскочить давление избавиться от всех ненужных плагинов, консолидировать GSPS, переосмыслить затворов, использовать АОП только тогда, когда это абсолютно необходимо и т.д.

1

Раньше у нас были подобные проблемы, поэтому наша команда начала использовать одну за приложение кота , Мы также разделили учетные данные в целях безопасности. Теперь им проще управлять ими, отслеживать журналы и делать периодические обновления.

Подсказка: легче (imho и cleaner) обучать администратора при создании пользователей, home_dirs с экземплярами tomcats и просто предоставлять учетные данные.

Смежные вопросы