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"