Error 'Not enough space' de OpenJDK en Digital Ocean
Un error muy común cuando empiezas con Digital Ocean, es que al instalar casi cualquier programa basado en Java como SonarQube obtienes enseguida un error de espacio en memoria. En mi caso, al iniciar el servicio de SonarQube he obtenido un error similar al siguiente.
Running SonarQube...
wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
jvm 1 | 2020.01.06 17:26:13 INFO app[][o.s.a.AppFileSystem] Cleaning or creating temp directory /var/opt/sonarqube-8/temp
jvm 1 | 2020.01.06 17:26:13 INFO app[][o.s.a.es.EsSettings] Elasticsearch listening on /127.0.0.1:9001
jvm 1 | 2020.01.06 17:26:13 INFO app[][o.s.a.ProcessLauncherImpl] Launch process[[key='es', ipcIndex=1, logFilenamePrefix=es]] from [/var/opt/sonarqube-8/elasticsearch]: /var/opt/sonarqube-8/elasticsearch/bin/elasticsearch
jvm 1 | 2020.01.06 17:26:13 INFO app[][o.s.a.SchedulerImpl] Waiting for Elasticsearch to be up and running
jvm 1 | OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
jvm 1 | 2020.01.06 17:26:14 INFO app[][o.e.p.PluginsService] no modules loaded
jvm 1 | 2020.01.06 17:26:14 INFO app[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.transport.Netty4Plugin]
jvm 1 | OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000e5330000, 449642496, 0) failed; error='Not enough space' (errno=12)
jvm 1 | #
jvm 1 | # There is insufficient memory for the Java Runtime Environment to continue.
jvm 1 | # Native memory allocation (mmap) failed to map 449642496 bytes for committing reserved memory.
jvm 1 | # An error report file with more information is saved as:
jvm 1 | # ../logs/es_hs_err_pid6724.log
jvm 1 | 2020.01.06 17:26:14 WARN app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 1
jvm 1 | 2020.01.06 17:26:14 INFO app[][o.s.a.SchedulerImpl] Process[es] is stopped
jvm 1 | 2020.01.06 17:26:14 INFO app[][o.s.a.SchedulerImpl] SonarQube is stopped
jvm 1 | 2020.01.06 17:26:16 INFO app[][o.e.c.t.TransportClientNodesService] failed to get node info for {#transport#-1}{d6qtSSpxQdmKK7HdJgDjIQ}{127.0.0.1}{127.0.0.1:9001}, disconnecting...
jvm 1 | java.lang.IllegalStateException: Future got interrupted
...
jvm 1 | ... 17 common frames omitted
wrapper | <-- Wrapper Stopped
Es muy importante aprender a leer los errores y encontrar realmente la causa. En este caso, la línea más importante y que nos dice cuál es el origen del error es la siguiente:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000e5330000, 449642496, 0) failed; error='Not enough space' (errno=12)
Sin duda, al leer este error se puede entender de manera clara que está pasando, y no es más que el OpenJDK no tiene la memoria suficiente para ejecutar la máquina virtual y correr el SonarQube. Es bien sabido que la máquina virtual de java consume bastantes recursos del servidor. Otro punto importante aquí, es ver la cantidad de memoria que no se ha podido asignar. En este caso, la siguiente línea nos dice cuánta memoria nos falta para correr nuestro programa.
# Native memory allocation (mmap) failed to map 449642496 bytes for committing reserved memory.
Haciendo la conversión nos damos cuenta que nos faltan alrededor de 449.64 MB en memoria RAM. Con esto, ya podemos tranquilamente ingresar a nuestra cuenta en Digital Ocean, seleccionar nuestro Droplet, y en la opción Resize seleccionar CPU and RAM Only y seleccionar después el plan adecuada según las necesidades. Espero que este post te haya sido de ayuda, hasta pronto!.