Я использую sbt с достаточным объемом памяти и PermSize (см. значения ниже), но все еще получаю ошибки памяти.
[error] java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
Мой сценарий sbt выглядит следующим образом.
SBT_OPTS="-Xms1024M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=4028M" java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
Я вношу изменения в IDE IntelliJ 13, а затем использую следующие команды для запуска моего приложения Play.
$ ./sbt
[name-of-my-play-project] $ compile
[name-of-my-play-project] $ ~run
Я также пробовал просто run
вместо ~run
. Я могу запустить проект и посетить страницы, если выполню холодный запуск, используя $./sbt, за которым следует ~run. Однако после нескольких изменений кода Play больше не отвечает.
Я попытался запустить тот же проект на другом компьютере (тоже OS-X), где я получаю похожее поведение. Меня беспокоит то, что это происходит не постоянно, но происходит достаточно часто, что делает меня непродуктивным, потому что мне приходится перезапускать sbt и играть с нуля, что полностью сводит на нет одно из ключевых преимуществ фреймворка Play2.
Я был бы признателен, если бы кто-нибудь мог помочь с тем, где я должен начать искать, чтобы определить, что не так с моей настройкой.
Я создал проект с помощью активатора, а затем начал использовать для него sbt.
ОБНОВЛЕНИЕ — снимок экрана из YourKit (по предложению @James), на котором показана утечка памяти.
ОБНОВЛЕНИЕ 2 YourKit показывает взаимоблокировку (см. прикрепленный снимок экрана). Я не уверен, что это основная причина проблемы. Я помещаю это здесь на всякий случай, если кто-то может дать больше информации о том, что происходит.
ОБНОВЛЕНИЕ 3 — РЕШЕНИЕ После более чем 12 часов непрерывной отладки мне наконец удалось разобраться. Это была очень простая вещь, которую я объясню в конце. Поскольку в моем коде было много сторонних библиотек/плагинов (ReactiveMongo, Redis, ...), и я не был уверен, что что-то из этого вызывает ошибку OutOfMemory. Поэтому я просто удалил весь ненужный код, пока у меня не остался простой контроллер с одним методом, который просто возвращает простой «Hello world». Я все еще получаю ту же ошибку с этой простой программой. Это означало, что что-то не так с моей конфигурацией. Я попытался изменить версию sbt на 0.13.5 (sbt.version=0.13.5
) в моем project/build.properties
, и это все равно не помогло. Я скачал новый sbt-launch.jar (0.13.5), но проблема осталась. Опять же, одна вещь, которая оставалась неизменной, заключалась в том, что ошибка никогда не менялась. Так что по какой-то причине флаги для sbt не установлены.
Мой sbt
скрипт bash выглядел так (ВСЕ В ОДНОЙ СТРОКЕ) -
SBT_OPTS="-Xms1024M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=4028M" java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
я изменил его на
SBT_OPTS="-Xms1024M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=4028M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
Это исправило это. Опять же, это была проблема с загрузкой классов, но не в моем коде, а в конфигурации sbt.