Как предотвратить java.lang.OutOfMemoryError: пространство PermGen в Scala компиляции?

Я заметил странное поведение моего компилятора 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.

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

Ответ 1

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

Ответ 2

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

Ответ 3

Я предположил, что вы используете 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. Они имеют решающее значение для предотвращения ошибок в памяти, связанных либо с устаревшим, либо с избыточным или метаспасом. Разумеется, рассмотрите возможность адаптации значений флага или добавления любых других флагов.

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

Ответ 4

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

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

user-profile$ sbt

Затем

sbt-project-name 0.1> clean

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

Первоначально использую команду вроде:

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

Ответ 8

измените следующий код в файле 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 config

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