Я заметил странное поведение моего компилятора 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.
Кто-нибудь знает, что может быть причиной этой ошибки? Заранее благодарим за понимание.
scala
apache-spark
memory-management
sbt
scalatra-sbt
BumbleGee
источник
источник
java.lang.OutOfMemoryError: Metaspace
(эквивалентная проблема для Scala, работающего на Java 8), если вы замените ихMaxPermSize
наMaxMetaspaceSize
.Ответы:
Причина в
OutOfMemoryError: PermGen space
том, что у него недостаточно постоянного места для генерации :) Если вы используете Oracle JVM, вам нужно добавить-XX:MaxPermSize=256M
аргумент (или какой-либо другой объем пространства) в вашsbt
сценарий. Для других JVM смотрите их документацию.источник
-Xmx
не может использоваться для PermGen.sbt
вам нужен-J-XX:MaxPermSize=256M
вместо-XX:MaxPermSize=256M
. Ответ Тваро более точен и полон, к тому же он не высмеивает вопрос.Я использую HomeBrew для установки sbt в OS X. Он поддерживает
SBT_OPTS
аргумент, который можно поместить в~/.sbtconfig
файл с помощьюexport SBT_OPTS=-XX:MaxPermSize=256M
.источник
which sbt
#! / bin / sh test -f ~ / .sbtconfig &&. ~ / .sbtconfig exec java -Xmx512M $ {SBT_OPTS} -jar /usr/local/Cellar/sbt/0.13.1/libexec/sbt-launch.jar «$ @»Use of ~/.sbtconfig is deprecated, please migrate global settings to /usr/local/etc/sbtopts
,Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
Я предполагал, что вы используете 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. Они критически важны для предотвращения ошибок нехватки памяти, связанных либо с перманентом, либо с исчерпанием метапространства . Конечно, рассмотрите возможность адаптации значений флагов или добавления любых других требуемых флагов.Более подробную информацию и альтернативные подходы можно найти в этом сообщении блога .
источник
/usr/local/etc/sbtopts
(для sbt, установленного с Homebrew на Mac).У меня была эта проблема, я играл с ней в течение 10 минут, просматривая сайты, пытающиеся изменить размер памяти.
Оказывается, я решил это,
Потом,
sbt-project-name 0.1> clean
Это прояснило мне ситуацию.
источник
Для меня это похоже на утечку памяти в SBT, поскольку в моем случае программа компилируется и успешно запускается примерно 3-5 раз, прежде чем произойдет исключение, которое устраняется перезапуском SBT.
Наиболее адекватным решением,
-XX:MaxPermSize=
как предлагает Алексей Романов, является параметр JVM, или периодически перезапускать SBT, если это помогает.Но есть еще один интересный способ: попробуйте перейти на Java 8 . AFAIK он больше не использует PermGen и, вероятно, таким образом невосприимчив к этому исключению.
Я все еще надеюсь, что авторы SBT рассмотрят эту проблему в будущих версиях.
источник
Я строю с помощью плагина Jenkins sbt, и у меня были те же проблемы. Они были разрешены после копирования SBT_OPTS из файла sbt во флаги JVM конфигурации задания Jenkins.
источник
Первоначально использовалась такая команда, как:
Я получил сначала OutOfMemoryError: пространство PermGen, которое я решил использовать
-XX:MaxPermSize
, а затем OutOfMemoryError: пространство кучи Java , для которого-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"
источник