Responder al comentario

Maven java.lang.OutOfMemoryError

Versión para imprimirVersión PDF

Trabajando con maven recientemente tuve problemas durante el proceso de construcción de mi aplicación y es que la compilación terminaba abruptamente especificando el siguiente error.

java.lang.OutOfMemoryError: Java heap space
...

Lo cual en algún otro tiempo con un ambiente diferente hubiera interpretado como "el equipo no tiene recursos suficientes para continuar con el proceso de construcción. Sin embargo resulta que el equipo en dónde estaba realizando la construcción tiene sufucientes recursos (memoria y procesador) para realizar la tarea sin problemas.

Investigando un poco me dí cuenta de que este es un problema frecuente sobre todo en proyectos dónode sehace uso extensivo de test unitarios y/o generación de reportes.

Pues bien encontré y comprobé 2 soluciones quea continuación comparto. La primera implica dar de alta la variable de mabiente MAVEN_OPTS de la siguiente manera.

export MAVEN_OPTS="-Xmx768m -XX:MaxPermSize=256m"

Con esto el problema desapareció por completo. Como se ve, en esta variable podemos especificar argumentos para enviar al compilador de java, en este caso específico, se ajustan parámetros de memoria, el tamaño máximo a utilizar por la JVM y el tamaño máximo para el área de generación.

Debo comentar que en un primer mi variable estaba definida de la siguiente manera

export MAVEN_OPTS="-Xmx768m"

Con esta definición el número de veces que el proceso de compilación tronaba se redujo considerablemente, sin embargo no desapareció por completo. Lo que sí ocurrió al agregar el parámetro -XX:MaxPermSize a la variable.

La segunda solución implica modificar el archivo pom.xml de nuestro proyecto para dejarlo de la siguiente manera.

  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <meminitial>768m</meminitial>
          <maxmem>768m</maxmem>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...

En mi opinión esta solución es menos intrusiva ya que no implica modificar el ambiente, sin embargo los tags meminitial y maxmem del plugin se traducen en los parámetros -Xms y -Xmx del compilador de java, es decir, esta solución es equivalente a dar de alta la variable MAVEN_OPTS de la siguiente manera.

export MAVEN_OPTS="-Xms768m -Xmx768m"

Revisando la documentación del plugin no encontré alguna opción equivalente al parámetro -XX:MaxPermSize, con lo cual aunque no me ha ocurrido me parece que sigue estando suceptible a presentar el error en algún momento.

Me parece que brinda un mejores posibilidades la solución de MAVEN_OPTS sin embargo tiene el problema de que requiere modificar el ambiente (sesión de usuario del sistema operativo), la solución a través de la configuración del plugin sin bien es reducida en cuanto a opciones hasta ahora me ha funcionado correctamente.

Your rating: None Average: 5 (1 vote)

Responder

CAPTCHA
Esta pregunta es para verificar qué eres un humano y prevenir envío de SPAM.
Image CAPTCHA
Enter the characters (without spaces) shown in the image.