scala apache-spark memory-management sbt scalatra-sbt

Cómo evitar java.lang.OutOfMemoryError: PermGen space en la compilación Scala?



apache-spark memory-management (8)

He notado un comportamiento extraño de mi compilador scala. Ocasionalmente arroja un OutOfMemoryError al compilar una clase. Aquí está el mensaje de error:

[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

Solo ocurre de vez en cuando y el error generalmente no se produce en la ejecución de compilación posterior. Uso Scala 2.9.0 y compilo a través de SBT.

¿Alguien tiene una pista sobre cuál podría ser la causa de este error? Gracias de antemano por sus ideas.


Estoy construyendo con el plugin de Jenkins sbt y tuve los mismos problemas. Se resolvieron después de copiar SBT_OPTS del archivo sbt a los indicadores JVM de la configuración de trabajo de Jenkins.


La causa del OutOfMemoryError: PermGen space es que no tiene suficiente espacio de generación permanente :) Si está utilizando Oracle JVM, necesita agregar el -XX:MaxPermSize=256M (o alguna otra cantidad de espacio) a su sbt guión. Para otras JVM, mira su documentación.


Originalmente usando un comando como:

java -jar /path/to/sbt-launch.jar test

Obtuve primero OutOfMemoryError: espacio PermGen que resolví usando -XX:MaxPermSize , y luego OutOfMemoryError: espacio de pila de Java , a lo que -Xmx fue el remedio.

Entonces en mi caso, un comando como este funcionó:

java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test


Parece una fuga de memoria en SBT para mí, ya que en mi caso el programa se compila y se ejecuta satisfactoriamente durante unas 3-5 veces antes de llegar a la excepción que se soluciona mediante el reinicio de SBT.

La solución más adecuada parece ser -XX:MaxPermSize= parámetro JVM como sugiere Alexey Romanov o reiniciar SBT periódicamente si ayuda.

Pero hay otra forma interesante: intente cambiar a Java 8 . AFAIK ya no usa PermGen y probablemente sea inmune a esta excepción de esta manera.

Todavía espero que los autores de SBT aborden este tema en futuras versiones.


Supuse que estás usando sbt 0.13.6 o superior. Cree .sbtopts archivo .sbtopts en la raíz de su proyecto sbt con el siguiente contenido:

-J-Xmx4G -J-XX:MaxMetaspaceSize=1G -J-XX:MaxPermSize=1G -J-XX:+CMSClassUnloadingEnabled

MaxMetaspaceSize es para Java 8, mientras que MaxPermSize es para Java 7. Son fundamentales para evitar errores de falta de memoria relacionados con el agotamiento de permgen o metaspace . Por supuesto, considere adaptar los valores del indicador o agregar cualquier otro indicador requerido.

Se pueden encontrar más detalles y enfoques alternativos en esta publicación de blog .


Tuve este problema, lo jugué durante 10 minutos y busqué en sitios que intentan cambiar el tamaño de la memoria.

Resulta que lo resolví por,

user-profile$ sbt

Entonces,

sbt-project-name 0.1> clean

Esto lo aclaró para mí.


Uso HomeBrew para instalar sbt en OS X. Es compatible con un argumento SBT_OPTS que se puede colocar en el archivo ~/.sbtconfig con export SBT_OPTS=-XX:MaxPermSize=256M .


cambie el siguiente bloque de código en el archivo sbt.sh y guárdelo bien.

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" }

o

usando terminal para exportar la configuración de sbt

export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"