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