Fallo de compilación de memoria insuficiente de Maven

88

A partir de hoy, mi compilación de maven falla.

[INFO] [ERROR] Unexpected
[INFO] java.lang.OutOfMemoryError: Java heap space
[INFO]  at java.util.Arrays.copyOfRange(Arrays.java:2694)
[INFO]  at java.lang.String.<init>(String.java:203)
[INFO]  at java.lang.String.substring(String.java:1877)

[ERROR] Memoria insuficiente; para aumentar la cantidad de memoria, use el indicador -Xmx al inicio (java -Xmx128M ...)

A partir de ayer, había ejecutado con éxito una compilación de maven.

A partir de hoy, he aumentado mi montón a 3 GB . Además, solo cambié 2-3 líneas menores de código, por lo que no entiendo este error de "memoria insuficiente".

vagrant@dev:/vagrant/workspace$ echo $MAVEN_OPTS
-Xms1024m -Xmx3000m -Dmaven.surefire.debug=-Xmx3000m

EDITAR: Probé el comentario del póster cambiando el pom.xml de mi módulo fallido. Pero obtuve el mismo error de compilación de maven.

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.5</source>
            <target>1.5</target>
            <fork>true</fork>
            <meminitial>1024m</meminitial>
            <maxmem>2024m</maxmem>
       </configuration>
    </plugin>
Kevin Meredith
fuente
1
¿Podría proporcionar más del seguimiento de pila? Tengo curiosidad por ver qué podría estar causando que una inicialización de cadena se quede sin memoria. Establecer el tamaño del montón en MAVEN_OPTS suena como el camino a seguir, pero supongo que en algún lugar hay una Cadena ridículamente grande para la que es posible que no esté asignando lo suficiente -Xmx.
Edward Samson

Respuestas:

136

¿De qué tipo de módulo 'web' estás hablando? ¿Es una guerra simple y tiene tipo de empaque guerra?

Si no está utilizando el kit de herramientas web de Google (GWT), no necesita proporcionar ninguna gwt.extraJvmArgs

Bifurcar el proceso de compilación puede no ser la mejor idea, porque inicia un segundo proceso que ignora por MAVEN_OPTScompleto, lo que dificulta el análisis.

Entonces intentaría aumentar el Xmx configurando MAVEN_OPTS

export MAVEN_OPTS="-Xmx3000m"

Y no bifurque el compilador a un proceso diferente

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.5</source>
        <target>1.5</target>
   </configuration>
</plugin>

El aumento -XX:MaxPermSize=512mno debería ser necesario porque si el tamaño de la permanente es la razón del problema, entonces esperaría el errorjava.lang.OutOfMemoryError: PermGen space

Si eso no resuelve su problema, puede crear volcados de pila para un análisis más detallado agregando -XX:+HeapDumpOnOutOfMemoryError. Además, puede usar jconsole.exe en su directorio bin de java para conectarse a jvm mientras se ejecuta la compilación y ver qué está pasando dentro del montón de jvm.

Otra idea (puede ser estúpida) que se me ocurrió, ¿tiene suficiente RAM dentro de su máquina? Definir el tamaño de la memoria es bueno, pero si su host tiene solo 4GB y luego puede tener el problema de que Java no puede usar la memoria definida porque ya la usa el sistema operativo, Java, MS-Office ...

vach
fuente
gracias por su respuesta. ¿Su sugerencia de eliminar la JVM bifurcada también se aplica al 'maven-surefire-plugin?' Probé su sugerencia de aumentar mi memoria MAVEN_OPTS a 3000. Mi compilador maven no tenía una configuración para una JVM bifurcada, por lo que no necesitaba cambiar nada allí. Y sí, mi máquina virtual invitada tiene 4 GB de RAM. La máquina host tiene 8 GB de RAM.
Kevin Meredith
2
por cierto, la compilación de mvn volvió a fallar con sus sugerencias.
Kevin Meredith
1
Por lo general, trato de evitar la bifurcación del proceso siempre que no lo haga funcionar. Si su sistema tiene solo 4 GB, el sistema operativo utiliza ~ 1 GB. Entonces tienes 3GB de descanso. Si maven comienza con Xms = 1GB, el resto de la memoria libre es de 2GB. A continuación, la bifurcación del compilador comenzó con Xms = 1GB .... que reduce la memoria libre a 1GB. Ahora puede restar 128 MB de memoria PermGen, el proceso de complemento a prueba de fallas bifurcado, ... Como puede ver, su configuración de Xmx probablemente nunca podría usarse como JVM ya que la memoria es simple, no libre. ¿Ha intentado utilizar JConsole? y HeapDumpOnOutOfMemoryError?
vach
Eliminé el Xms1024m de mi MAVEN_OPTS, pero la compilación de mvn aún falló. Agregué "HeapDump ..." a mi MAVEN_OPTS, pero no estoy seguro de dónde se imprime el volcado. Buscando en JConsole ahora.
Kevin Meredith
Los volcados son plces en el directorio jvms
vach
36

Respondiendo tarde para mencionar otra opción en lugar de la MAVEN_OPTSvariable de entorno común para pasar a la compilación de Maven las opciones de JVM requeridas.

Desde Maven 3.3.1 , puede tener una .mvncarpeta como parte del proyecto en cuestión y un jvm.configarchivo como lugar perfecto para dicha opción.

dos nuevos archivos de configuración opcionales .mvn/jvm.configy .mvn/maven.config, ubicados en el directorio base del árbol de fuentes del proyecto. Si están presentes, estos archivos proporcionarán las opciones jvm y maven predeterminadas. Debido a que estos archivos son parte del árbol de fuentes del proyecto, estarán presentes en todas las comprobaciones del proyecto y se usarán automáticamente cada vez que se compile el proyecto.

Como parte de las notas de la versión oficial

En Maven no es sencillo definir la configuración de JVM por proyecto. El mecanismo existente basado en una variable de entorno MAVEN_OPTSy el uso de ${user.home}/.mavenrces otra opción con el inconveniente de no ser parte del proyecto.

A partir de esta versión, puede definir la configuración de JVM a través de un ${maven.projectBasedir}/.mvn/jvm.configarchivo, lo que significa que puede definir las opciones para su compilación por proyecto. Este archivo se convertirá en parte de su proyecto y se registrará junto con su proyecto. Lo que no necesita más para MAVEN_OPTS, .mavenrcarchivos. Entonces, por ejemplo, si coloca las siguientes opciones de JVM en el ${maven.projectBasedir}/.mvn/jvm.configarchivo:

-Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true

La principal ventaja de este enfoque es que la configuración está aislada del proyecto en cuestión y se aplica a toda la compilación también, y es menos frágil que MAVEN_OPTSpara otros desarrolladores que trabajan en el mismo proyecto (olvidándose de configurarlo).
Además, las opciones se aplicarán a todos los módulos en caso de un proyecto de varios módulos.

A_Di-Matteo
fuente
2
Tenga en cuenta que MaxPermSize se ignora si está utilizando JDK 8.
GeraldScott
14

Tengo el mismo problema al intentar compilar una "instalación limpia" usando un VPS de RAM de 512 Mb Lowend y una buena CPU. Ejecute OutOfMemory y eliminó el script repetidamente.

Usé export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"y trabajé.

Todavía tengo algún otro error de compilación porque es la primera vez que necesito Maven, pero el problema de OutOfMemory ha desaparecido.

m3nda
fuente
11

Agregar opción

-XX:MaxPermSize=512m

a MAVEN_OPTS

maven-compiler-plugin opciones

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
      <fork>true</fork>
      <meminitial>1024m</meminitial>
      <maxmem>2024m</maxmem>
    </configuration>
  </plugin>
Ilya
fuente
2
De hecho, agregué la opción, -XX: MaxPermSize = 1024m, después de hacer esta publicación. Pero todavía tengo un error de memoria insuficiente. Otra publicación de SO mencionó que necesito agregar una opción a argLine de maven-surefire-plugin para aumentar la memoria utilizada por los hilos bifurcados. Lo aumenté a <argLine> -Xms256m -Xmx1024m -XX: PermSize = 128m -XX: MaxPermSize = 512m </argLine>
Kevin Meredith
Debería haber mencionado que ... No, la compilación experta aún falló.
Kevin Meredith
Agregue todas estas propiedades maven-compilier-pluginy aumente -XX:MaxPermSize, Xmxdebería ser =XX:MaxPermSize
Ilya
También use la opción <fork> true </true> enmaven-compilier-plugin
Ilya
Intenté eso (consulte la publicación original), pero mi compilación de mvn aún falló.
Kevin Meredith
4

Tuve el mismo problema al compilar Druid.io, aumentando MaxDirectMemorySize finalmente funcionó.

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
hahakubile
fuente
Curioso, MaxDirectMemorySize es aparentemente ilimitado por defecto (es decir, agregó un límite, no ajustó uno preexistente).
Tomer Gabel
4

Esta siguiente configuración funciona en mi caso

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire-plugin.version}</version>
    <configuration>
        <verbose>true</verbose>
        <fork>true</fork>
        <argLine>-XX:MaxPermSize=500M</argLine>
    </configuration>
</plugin>

Intente utilizar -XX: MaxPermSize en lugar de -XX: MaxPermGen

Narayan Yerrabachu
fuente
4
_JAVA_OPTIONS="-Xmx3G" mvn clean install
Administrador de dispositivos
fuente
3

¿En qué tipo de sistema operativo estás ejecutando?

Para asignar más de 2 GB de RAM, debe ser al menos un sistema operativo de 64 bits.

Luego hay otro problema. Incluso si su sistema operativo tiene RAM ilimitada, pero está fragmentada de tal manera que no hay un solo bloque libre de 2GB disponible, también se quedará sin excepciones de memoria. Y tenga en cuenta que la memoria Heap normal es solo una parte de la memoria que usa el proceso de VM. Por lo tanto, en una máquina de 32 bits, probablemente nunca podrá configurar Xmx en 2048 MB.

También sugeriría establecer un mínimo y un máximo de memoria en el mismo valor, porque en este caso, tan pronto como la VM se quede sin memoria, el primer tiempo se asigna 1GB desde el principio, la VM luego asigna un nuevo bloque (asumiendo que aumenta con 500 MB de bloques) de 1,5 GB después de que se asignen, copiará todas las cosas del bloque uno al nuevo y liberará la memoria después de eso. Si se vuelve a quedar sin memoria, se asignan 2GB y luego se copian los 1,5 GB, asignando temporalmente 3,5GB de memoria.

Christofer Dutz
fuente
1

Mientras crea el proyecto en la plataforma Unix / Linux, configure la sintaxis de las opciones de Maven como se muestra a continuación. Tenga en cuenta que los signos de una sola pregunta, no una doble cita.

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
ÖMER TAŞCI
fuente
0

El uso de .mvn / jvm.config funcionó para mí y tiene el beneficio adicional de estar vinculado con el proyecto.

colinbes
fuente
0

Esto sucede en grandes proyectos en Windows cuando se usa cygwin u otro emulador de Linux (git bash). Por alguna coincidencia, ambos no funcionan en mi proyecto, lo que es un gran proyecto de código abierto. En un script sh, se llaman a un par de comandos mvn. El tamaño de la memoria crece hasta un tamaño de pila mayor que el especificado en Xmx y la mayoría de las veces, en un caso, se inicia el segundo proceso de Windows. Esto hace que el consumo de memoria sea aún mayor.

La solución en este caso es usar un archivo por lotes y un tamaño Xmx reducido y luego las operaciones de maven son exitosas. Si hay interés puedo revelar más detalles.

zhrist
fuente
0

Alguien ya ha mencionado el problema con el sistema operativo de 32 bits. En mi caso, el problema era que estaba compilando con JDK de 32 bits.

usuario2046211
fuente
0

El aumento del tamaño de la memoria en la variable de entorno 'MAVEN_OPTS' ayudará a resolver este problema. Para mí, el aumento de -Xmx756M a -Xmx1024M funcionó.

Nidhi
fuente