Устранение неполадок «Ошибка нехватки памяти: Metaspace» в Play для Scala - PullRequest
0 голосов
/ 02 июля 2018

Во время работы в режиме разработки в Play for Scala (2.5.x), после примерно трех часов изменения кода и горячего развертывания, Play зависает с ошибкой java.lang.OutOfMemoryError: Metaspace.

После некоторых исследований проблема, похоже, заключается в том, что приложение создает экземпляры Java-объектов (таких как фабрики и соединения), о которых Play не знает, и при перезапуске Play эти объекты остаются в памяти, вызывая утечки. Решение состоит в том, чтобы очистить компоненты, когда Play отключается, как объяснено здесь , или уничтожить их после их использования.

Проблема в том, что я убираю все эти объекты и все равно получаю OutOfMemoryError. Я попытался с помощью Java jconsole выяснить, какие классы создают утечку и сколько памяти они занимают, но не смог найти много. Есть идеи как справиться с этой ситуацией? Я не хочу просто увеличивать память, не зная, что происходит.

PS: Кажется, это общая проблема, было бы здорово, если бы Play сам предоставил инструменты для ее обнаружения.

1 Ответ

0 голосов
/ 02 июля 2018

К сожалению, эта проблема в настоящее время кажется неизбежной. Хотя в Play 2.6 стало лучше, я все же сталкиваюсь с этим.

И это не имеет ничего общего с компонентами, которые не очищаются, в метапространстве загружаются классы. Play (динамически) создает много классов (например, анонимных классов) при компиляции, и каждый из этих классов добавляет в метапространство, которое в итоге заполняется.

Мое предложение было бы просто увеличить -XX:MaxMetaspaceSize, пока вы не сможете работать в течение нескольких часов без этого исключения. Затем перезапустите sbt время от времени. Я использую 500 МБ в настоящее время, что, кажется, хорошо (обычно это 128 МБ с пусковой установкой SBT):

sbt -J-XX:MaxMetaspaceSize=500m

Обычно это не проблема в работе, так как у вас загружено фиксированное количество классов (без компиляции в работе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...