scala - tutorial - ¿Es java.lang.OutOfMemoryError: Metaspace normal en sbt REPL?
scala sbt tutorial (1)
Soy nuevo en Scala, sbt y su REPL . Una cosa que realmente me encanta es la opción ~
para hacer un bucle de una ejecución o compilación cuando se editan archivos. Así que termino corriendo ~run
bastante a menudo.
Pero se pierde la memoria. Como después de 20-30 se ejecuta todo el shell interactivo sbt se bloquea con:
[info] Compiling 1 Scala source to /home/[redacted]
sbt appears to be exiting abnormally.
The log file for this session is at /tmp/sbt853875123365456892.log
java.lang.OutOfMemoryError: Metaspace
Error during sbt execution: java.lang.OutOfMemoryError: Metaspace
Honestamente, no es un gran problema, pero si bien entiendo qué es un OOME, la pregunta que estoy tratando de resolver es: ¿es realmente lo que se supone que es? La respuesta es "no", pero ...
- es un error sbt? (¿Debo tratar de reportarlo?)
- ¿Hay algún problema con mi programa? (¿pérdida de memoria?)
Básicamente, el SBT, cuando compila y ejecuta su programa, usa solo una JVM, con la que se ejecutó. Como tal, si hay algo en el metaspacio que no pueda ser recolectado como basura, es posible que se quede sin memoria; por ejemplo, si crea alguna conexión (vi ejemplos de MongoDB o ElasticSearch) y se olvida de cerrarla cuando se apaga, permanecerá abierto para evitar de haber recogido algunos objetos, después de varios ciclos de recompilación y recarga, es posible que pocos objetos utilicen su metaspacio.
Por lo tanto, es una pérdida de memoria que generalmente no afectaría su programa, pero SBT lo hace visible como una excepción que vio.
A largo plazo, debe identificar la fuga y eliminarla, para una solución alternativa puede usar algo como el revólver SBT, que le permite iniciar el programa en otra JVM, por lo que las pérdidas de memoria no se resumirán, ya que solo estará cerrando y ejecutar la nueva JVM en lugar de ejecutar todo en la misma JVM que SBT.