Как предотвратить java.lang.OutOfMemoryError: пространство PermGen при компиляции Scala?
Я заметил странное поведение моего компилятора scala. Иногда он выдает OutOfMemoryError при компиляции classа. Вот сообщение об ошибке:
[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.
Кто-нибудь знает, что может послужить причиной этой ошибки? Заранее благодарим за понимание.
- Как изменить типы столбцов в DataFrame Spark SQL?
- Почему «разделение» на пустую строку возвращает непустой массив?
- Каков самый быстрый способ написать функцию Фибоначчи в Scala?
- Обеспечивает ли JVM оптимизацию хвостовых вызовов?
- Решение проблем зависимостей в Apache Spark
- Как распечатать содержимое RDD?
- Как создать экземпляр типа, представленного параметром type в Scala
- Анализ многострочных записей в Scala
- Добавить банки в Spark Job - spark-submit
- В Scala, что означает «val a: A = _» (подчеркивание), означает?
- Как читать файлы из папки ресурсов в Scala?
- Запрос Spark SQL DataFrame со сложными типами
- Скала «для понимания» с фьючерсами
Причиной для OutOfMemoryError: PermGen space
является то, что он не имеет достаточного пространства постоянной генерации 🙂 Если вы используете Oracle JVM, вам нужно добавить -XX:MaxPermSize=256M
(или какой-либо другой объем) для вашего sbt
скрипт. Для других JVM посмотрите их документацию.
Я использую HomeBrew для установки sbt на OS X. Он поддерживает аргумент SBT_OPTS
который можно поместить в файл ~/.sbtconfig
с export SBT_OPTS=-XX:MaxPermSize=256M
.
Я предположил, что вы используете 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. Они имеют решающее значение для предотвращения ошибок в памяти, связанных либо с устаревшим, либо с избытком . Разумеется, рассмотрите возможность адаптации значений флага или добавления любых других флагов.
Более подробные и альтернативные подходы можно найти в этом блоге .
У меня была эта проблема, она играла с ней в течение 10 минут, глядя на сайты, пытающиеся resize памяти.
Оказывается, я разрешил это,
user-profile$ sbt
Затем,
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.
Первоначально использовалась команда вроде:
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
измените следующий код в файле 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"