Как предотвратить 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 ответов:
причиной
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"