Как предотвратить java.ленг.Исключение 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.

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

8 79

8 ответов:

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

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

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

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

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

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

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

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

user-profile$ sbt

затем,

sbt-project-name 0.1> clean

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

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

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

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

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

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

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

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

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

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

java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test

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