Как предотвратить java.lang.OutOfMemoryError: пространство PermGen при компиляции Scala? - PullRequest
79 голосов
/ 30 ноября 2011

Я заметил странное поведение моего компилятора scala. Иногда он генерирует OutOfMemoryError при компиляции класса. Вот сообщение об ошибке:

[info] Compiling 1 Scala source to /Users/gruetter/Workspaces/scala/helloscala/target/scala-2.9.0/test-classes...
java.lang.OutOfMemoryError: PermGen space
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space

Это происходит только время от времени, и ошибка обычно не выдается при следующем запуске компиляции. Я использую Scala 2.9.0 и компилирую через SBT.

Кто-нибудь знает, что может быть причиной этой ошибки? Заранее благодарим за ваши идеи.

Ответы [ 8 ]

99 голосов
/ 11 октября 2012

Я использую HomeBrew для установки sbt на OS X. Он поддерживает аргумент SBT_OPTS, который можно поместить в файл ~/.sbtconfig с export SBT_OPTS=-XX:MaxPermSize=256M.

46 голосов
/ 01 декабря 2011

Причина OutOfMemoryError: PermGen space в том, что ему не хватает постоянного пространства генерации :) Если вы используете Oracle JVM, вам нужно добавить -XX:MaxPermSize=256M (или какой-то другой объем пространства) аргумент к вашему sbt сценарию.Для других JVM посмотрите их документацию.

36 голосов
/ 28 марта 2015

Я предполагал, что вы используете sbt 0.13.6 или выше.Создайте файл .sbtopts в корне проекта sbt со следующим содержимым:

-J-Xmx4G
-J-XX:MaxMetaspaceSize=1G
-J-XX:MaxPermSize=1G
-J-XX:+CMSClassUnloadingEnabled

MaxMetaspaceSize для Java 8, тогда как MaxPermSize для Java 7. Они важны дляпредотвратить ошибки нехватки памяти, связанные с исчерпанием permgen или metaspace .Конечно, рассмотрите возможность адаптации значений флагов или добавления любых других необходимых флагов.

Более подробную информацию и альтернативные подходы можно найти в этом сообщении в блоге .

5 голосов
/ 11 августа 2013

У меня была эта проблема, я поиграл с ней 10 минут, просматривая сайты, пытающиеся изменить размер памяти.

Оказывается, я решил,

user-profile$ sbt

Тогда

sbt-project-name 0.1> clean

Это прояснило для меня.

4 голосов
/ 22 февраля 2013

Для меня это выглядит как утечка памяти в SBT, так как в моем случае программа компилируется и успешно работает примерно 3-5 раз, прежде чем выполнить исключение, которое исправлено при перезапуске SBT.

Наиболее адекватным решением действительно является -XX:MaxPermSize= параметр JVM, как предлагает Алексей Романов, или периодически перезапускать SBT, если это помогает.

Но есть и другой интересный способ: попробуйте перейти на Java 8 . AFAIK, он больше не использует PermGen и, вероятно, невосприимчив к этому исключению.

Я все еще надеюсь, что авторы SBT решат эту проблему в будущих версиях.

2 голосов
/ 14 октября 2015

Первоначально с помощью такой команды:

java -jar /path/to/sbt-launch.jar test

Сначала я получил OutOfMemoryError: Пространство PermGen , которое я решил с помощью -XX:MaxPermSize, а затем OutOfMemoryError: Пространство кучи Java , к которому -Xmx было исправлено.

Так что в моем случае такая команда сработала:

java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test
2 голосов
/ 25 июля 2014

Я строю с плагином Jenkins sbt, и у меня были те же проблемы.Они были решены после копирования SBT_OPTS из файла sbt во флаги JVM конфигурации задания Jenkins.

0 голосов
/ 30 августа 2017

измените следующий блок кода в файле sbt.sh и сохраните его в порядке.

get_mem_opts () {
  local mem=${1:-1536}
  local perm=$(( $mem / 4 ))
  (( $perm > 256 )) || perm=1024 //256 to 1024
  (( $perm < 1024 )) || perm=2048 // 1024 to 2048
  local codecache=$(( $perm / 2 ))

  echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m"
}

или

использование терминала для экспорта конфигурации sbt

export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"
...