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 no suele aparecer en la siguiente ejecución de compilación. Uso Scala 2.9.0 y compilo a través de SBT.
¿Alguien tiene alguna idea de cuál podría ser la causa de este error? Gracias de antemano por sus ideas.
scala
apache-spark
memory-management
sbt
scalatra-sbt
BumbleGee
fuente
fuente
java.lang.OutOfMemoryError: Metaspace
(el problema equivalente para Scala que se ejecuta en Java 8) si reemplazaMaxPermSize
conMaxMetaspaceSize
.Respuestas:
La causa
OutOfMemoryError: PermGen space
es que no tiene suficiente espacio de generación permanente :) Si está utilizando Oracle JVM, debe agregar el-XX:MaxPermSize=256M
argumento (o alguna otra cantidad de espacio) a susbt
script. Para otras JVM, consulte su documentación.fuente
-Xmx
no se puede usar para PermGen.sbt
necesitas en-J-XX:MaxPermSize=256M
lugar de-XX:MaxPermSize=256M
. La respuesta de Tvaroh es más precisa y completa, además de que no se burla de la pregunta.Utilizo HomeBrew para instalar sbt en OS X. Es compatible con un
SBT_OPTS
argumento que se puede poner en un~/.sbtconfig
archivoexport SBT_OPTS=-XX:MaxPermSize=256M
.fuente
which sbt
#! / bin / sh test -f ~ / .sbtconfig &&. ~ / .sbtconfig exec java -Xmx512M $ {SBT_OPTS} -jar /usr/local/Cellar/sbt/0.13.1/libexec/sbt-launch.jar "$ @"Use of ~/.sbtconfig is deprecated, please migrate global settings to /usr/local/etc/sbtopts
,Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
Supuse que estás usando sbt 0.13.6 o superior. Cree un
.sbtopts
archivo 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 queMaxPermSize
es para Java 7. Son fundamentales para evitar errores de falta de memoria relacionados con el agotamiento de permgen o metaespacio . Por supuesto, considere la posibilidad de adaptar los valores de los indicadores o agregar cualquier otro indicador necesario.Se pueden encontrar más detalles y enfoques alternativos en esta publicación de blog .
fuente
/usr/local/etc/sbtopts
(para sbt instalado con Homebrew en Mac).Tuve este problema, jugué con él durante 10 minutos mirando sitios que intentaban cambiar el tamaño de la memoria.
Resulta que lo resolví por
Luego,
sbt-project-name 0.1> clean
Esto me lo aclaró.
fuente
Para mí, parece una pérdida de memoria en SBT, ya que en mi caso el programa se compila y se ejecuta correctamente durante unas 3-5 veces antes de hacer clic en la excepción que se soluciona mediante el reinicio de SBT.
De hecho, la solución más adecuada parece ser el
-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 problema en versiones futuras.
fuente
Estoy construyendo con el complemento sbt de Jenkins y tuve los mismos problemas. Se resolvieron después de copiar SBT_OPTS del archivo sbt a los indicadores JVM de la configuración del trabajo de Jenkins.
fuente
Originalmente usando un comando como:
Primero obtuve OutOfMemoryError: espacio de PermGen que resolví usando
-XX:MaxPermSize
, y luego OutOfMemoryError: espacio de pila de Java , 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
fuente
cambie el siguiente bloque de código en el archivo sbt.sh y guarde su funcionamiento 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 la terminal para exportar la configuración de sbt
export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"
fuente