Ошибка Grails PermGem - PullRequest
       39

Ошибка Grails PermGem

4 голосов
/ 20 июня 2011

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

Exception in thread "Thread-747" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-748" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-759" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-760" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-764" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-765" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-766" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-767" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-773" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-774" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-780" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-781" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-788" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-789" java.lang.OutOfMemoryError: PermGen space
2011-06-20 14:42:10,668 [http-8080-6] ERROR [/CM].[grails]  - Servlet.service() for servlet grails threw exception
java.lang.OutOfMemoryError: PermGen space
2011-06-20 14:42:10,668 [http-8080-6] ERROR [/CM].[default]  - Servlet.service() for servlet default threw exception
java.lang.OutOfMemoryError: PermGen space
: java.lang.OutOfMemoryError: PermGen space
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:116)
        at _GrailsPackage_groovy$_run_closure8.doCall(_GrailsPackage_groovy:275)
        at _GrailsPackage_groovy$_run_closure8.call(_GrailsPackage_groovy)
        at _GrailsRun_groovy$_run_closure8.doCall(_GrailsRun_groovy:245)
        at RunApp$_run_closure1.doCall(RunApp.groovy:35)
        at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381)
        at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415)
        at gant.Gant$_dispatch_closure7.doCall(Gant.groovy)
        at gant.Gant.withBuildListeners(Gant.groovy:427)
        at gant.Gant.this$2$withBuildListeners(Gant.groovy)
        at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
        at gant.Gant.dispatch(Gant.groovy:415)
        at gant.Gant.this$2$dispatch(Gant.groovy)
        at gant.Gant.invokeMethod(Gant.groovy)
        at gant.Gant.executeTargets(Gant.groovy:590)
        at gant.Gant.executeTargets(Gant.groovy:589)
Caused by: java.lang.OutOfMemoryError: PermGen space
--- Nested Exception ---
java.lang.OutOfMemoryError: PermGen space
Error automatically restarting container: java.lang.OutOfMemoryError: PermGen space
Error executing script RunApp: PermGen space
java.lang.OutOfMemoryError: PermGen space
Error executing script RunApp: PermGen space
Application context shutting down...
Application context shutdown.

Ответы [ 4 ]

20 голосов
/ 21 июня 2011

PermGen - это область памяти вашей JVM, используемая для загрузки классов.

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

Способ исправить это - добавить еще!

Это делается путем передачи одного или двух параметров в JVM при запуске приложения.

Параметры:

-XX:MaxPermSize=256m
-XX:PermSize=128m

(скорректируйте значения в соответствии с вашими потребностями)

PermSize будет исходным размером PermGen, а MaxPermSize будет максимальным размером, до которого он будет увеличиваться, прежде чем выдать вам исключение, как в вашем посте.

По умолчанию установлено значение 64M, что немного, если у вас есть «настоящее» приложение.

ОБРАТИТЕ ВНИМАНИЕ: Ваш total memory usage будет: Heap size + Perm Size

1 голос
/ 06 сентября 2011

Если вы используете Servlet версии 3.0, даже увеличение памяти не поможет, так как это проблема с Groovy-компилятором.Новая версия 1.8.2 / 1.9 (?), Которая будет выпущена в ближайшее время, решит эту проблему.Тем временем вы можете изменить версию сервлета обратно на «2.5» (в BuildConfig.groovy), что решит эту проблему.

Недостаток изменения версии сервлета в 2.5 состоит в том, что его нельзя развернуть в приложении Glassfish.сервер, так что уродливое решение - изменить на 2.5 и использовать "run-app".Если вы хотите выполнить развертывание на glassfish, измените версию сервлета на «3.0» в BuildConfig.groovy, запустите «war», а затем разверните войну на Glassfish.Измените его на «2.5», чтобы снова запустить на локальной машине разработчика.

0 голосов
/ 03 сентября 2015

В STS IDE, установленной согласно следующему:

-XX: MaxPermSize = 512 м -XX: PermSize = 128 м

enter image description here

Надеюсь, это поможет.

0 голосов
/ 20 июня 2011

Проверьте FAQ

Q: OMG Я получаю ошибки OutOfMemoryErrors или PermGen Space при запуске Grails в режиме разработки. Что мне делать?

Начиная с Grails 0.6, Grails автоматически перекомпилирует источники Java и классы домена с использованием предварительной компиляции, а затем перезапуск сервера. это может привести к исчерпанию пространства permgen, если сервер работает долго время и много изменений сделано. Вы можете отключить эту функцию, если она не важно для вас с:

grails -Ddisable.auto.recompile = true run-app

Существует также проблема с Grails 0.6 в Windows, где вы получаете OutOfMemoryErrors за период активности в режиме разработки из-за для повторной компиляции. Это может быть решено в голове SVN, но если вы видите эта проблема также может помочь вышеуказанная опция.

Проще всего перезапустить сервер приложений, когда это произойдет.

...