Есть ли способ предотвратить утечку Grails permgen при повторном развертывании в рабочем режиме на tomcat, несмотря на флаги JVM - PullRequest
4 голосов
/ 25 ноября 2011

Это старая знакомая проблема, но я очень хочу уложить ее в кровать раз и навсегда!У меня установлены следующие флаги JVM:

-XX: + CMSClassUnloadingEnabled -XX: + CMSPermGenSweepingEnabled -Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES = все еще * 100 * *4использование permgen увеличивается на хорошие 50 Мбит / с за каждый цикл развертывания.Я внедряю удаленно, используя приложение tomcat manager, и Grails находится в производственном режиме.

Если он слишком переполнен, необходимо kill -9!

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

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Утечка пермгена - это проблема, независимо от того, на каком сервере приложений вы работаете при использовании grails, это мой опыт (очень личный и, вероятно, легко спорный анекдот, просто чтобы прояснить это;)).

Если этоединственное приложение, которое вы развернули, почему бы не просто shutdown.sh, удалить папку webapp, положить в war, а затем startup.sh?

Это наш путь, и повторное развертывание выигрывает только около 7 секунд (где 5 изэто sleep 5, чтобы гарантировать полное отключение catalina перед тем, как он снова включится).

Edit:

По моему мнению, иметь по одному экземпляру tomcat на приложение довольно здорово!

1 голос
/ 26 ноября 2011

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

...