Устранение проблем утечки памяти Grails/Groovy?

У меня есть приложение Grails, которое делает довольно приличное количество создания и уничтожения объектов домена, и, похоже, он очень быстро выходит из пространства PermGen. Я выполнил обычные настройки (перехватил PermGen до 256M, включил класс GC и т.д.), Но не кубик.

Не хотелось бы рекомендовать некоторые (и, надеюсь, бесплатные или очень недорогие) инструменты для устранения неполадок такого рода потребления памяти в Groovy и/или Java? Или некоторые методы, которые вы используете для устранения неполадок с памятью JVM?

Изменить: это когда приложение развертывается внутри Tomcat в режиме производства; Я не пробовал с другими контейнерами. Тем не менее, было бы неплохо иметь некоторые ресурсы для отслеживания проблемы.

Ответ 1

Вы пробовали

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

?

Вместе с увеличением обычных подозреваемых (-Xmx, -Xms, -XX:PermSize и -XX:MaxPermSize) это разрешило все проблемы PermGen на нашем производстве Tomcat, которые произошли довольно скоро после развертывания приложения. Никогда не видел другого ООМ-Исключения после этого.: -)

Ответ 2

Мне лично нравится VisualVM. Есть определенно более мощные инструменты вокруг, но у этого есть хорошее отношение удобства к мощности.

Ответ 4

Eclipse Memory Analyzer - это бесплатный инструмент, который по крайней мере так же хорош, как и для Yourkit.

Ответ 5

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

Ответ 6

Проблема, с которой вы сталкиваетесь в процессе разработки или производства?

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

http://www.grails.org/FAQ#Q:%20OMG%20I%20get%20OutOfMemoryErrors%20or%20PermGen%20Space%20errors%20when%20running%20Grails%20in%20development%20mode.%20What%20do%20I%20do?

Если вы находитесь в производстве, то, очевидно, у вас есть гораздо более критическая проблема. Проблемы памяти PermGen относятся ко многим структурам, на которых построен Grails, включая Spring, Hibernate и даже Sun собственную JVM. Вы можете попробовать настроить максимальный размер кучи для своего веб-контейнера (Tomcat или Jetty).

Вы также можете попробовать другую реализацию JVM, например, Oracle JRockit, которая должна быть значительно лучше при сборке мусора и других средствах эффективности. Я никогда не пробовал это сам, но так как я тоже в середине развивающегося и обширного проекта Grails, я могу самостоятельно решить эти проблемы. Удачи!

Ответ 7

Если это произойдет после того, как вы повторно переустановите свое приложение несколько раз, на вас может повлиять эта ошибка Grails. Tomcat FAQ также имеет несколько возможных причин утечек PermGen.