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

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

Причиной для 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" 
  • Поток против представлений против iteratorов
  • Используйте комбинатор парсера Scala для parsingа CSV-файлов
  • Использование Либо для обработки сбоев в коде Scala
  • Как создать пустой DataFrame с указанной схемой?
  • Как сохранить пользовательские объекты в наборе данных?
  • В чем разница между == и .equals в Scala?
  • Асинхронный IO в Scala с фьючерсами
  • Как сопоставить шаблон, используя регулярное выражение в Scala?
  • Использовать случай scala.concurrent.blocking
  • Как загрузить локальный файл в sc.textFile вместо HDFS
  • Столбец Access Array в Spark
  • Interesting Posts

    Итерация через LinkedHashMap в обратном порядке

    Spring: Как ввести значение в статическое поле?

    Конструктор медленного SoapHttpClientProtocol

    VNC Viewer с именем пользователя?

    Что такое хороший микрофон и общая настройка для семейного видеочата через Skype?

    C # параметризованные запросы для Oracle – серьезная и опасная ошибка!

    Сделать все мои документы с текстом анонимными

    Как использовать PSCP для копирования файла с компьютера Unix на компьютер Windows, где целевой путь имеет пробелы?

    Почему sizeof (param_array) – размер указателя?

    Получение списка файлов в каталоге с глобусом

    Почему я не могу удалить файл, который я все еще вижу, но больше не на диске?

    Как я могу отключить 3G / Data программно на Android?

    Зачем использовать бинарный поиск, если есть тройной поиск?

    Как сделать WinRAR архив извлечения в папку, названную в честь архива, при двойном щелчке RAR-файлов?

    Загрузка данных D3.js из простой строки JSON

    Давайте будем гением компьютера.