Configuración del espacio de pila Java en Maven 2 en Windows


91

Recibo este mensaje durante la construcción de mi proyecto.

java.lang.OutOfMemoryError: espacio de almacenamiento dinámico de Java

¿Cómo puedo aumentar el espacio del montón? Tengo 8 Gb o RAM, es imposible que maven haya consumido tanto. Encontré esto http://vikashazrati.wordpress.com/2007/07/26/quicktip-how-to-increase-the -java-heap-memory-for-maven-2-on-linux / cómo hacerlo en linux, pero estoy en Windows 7. ¿Cómo puedo cambiar el espacio del montón de Java en Windows?


¿Supongo que está en la versión de 64 bits de Windows? De lo contrario, no va a especificar más de 1.5G como tamaño de pila, las otras ventanas de 0.5G que le permiten usar directamente serán requeridas por la JVM. Existe una opción para que Windows solo use 1G para el código de modo kernal y 3G para el código de modo de usuario, pero la JVM de sun no le permitirá usarlo.
vickirk

@vickirk Estoy en la versión de 64 bits de Windows
Gandalf StormCrow

1
¿También está utilizando una versión de 64 bits de la JVM? Aparecerá como Windows x64 en la lista desplegable de la página de descarga de JDK: java.sun.com/javase/downloads/widget/jdk6.jsp
Powerlord

Respuestas:


117

La variable de entorno a establecer es MAVEN_OPTS, por ejemplo MAVEN_OPTS=-Xmx1024m. La maxmemconfiguración en el pom solo se aplica cuando configura el complemento del compilador para que se bifurque javacen una nueva JVM. De lo contrario, el complemento se ejecuta dentro de la misma máquina virtual que Maven y, por lo tanto, dentro de la memoria pasada en la línea de comando a través de MAVEN_OPTS.

Para configurar MAVEN_OPTS en Windows 7:

  1. Haga clic derecho en Mi PC y seleccione Propiedades (atajo de teclado presione Windows+ Pause/Break)
  2. Haga clic en el enlace Configuración avanzada del sistema que se encuentra en la barra de navegación izquierda de Propiedades del sistema para mostrar las Propiedades avanzadas del sistema.
  3. Vaya a la pestaña Avanzado y haga clic en el botón Variables de entorno ubicado en la parte inferior de la ventana de configuración Propiedades avanzadas del sistema
  4. Cree una nueva variable de usuario, establezca el nombre de la variable en MAVEN_OPTS y establezca el valor de la variable en -Xmx1024m(o más)

Abra una nueva ventana de comando y ejecute mvn.


1
¿Tiene esto algún impacto en la velocidad de mi construcción? ¿Hay algún consejo para impulsar mi compilación maven asignándole más memoria?
Mahendran

45

Si se está quedando sin espacio de almacenamiento dinámico durante la ejecución de prueba de JUnit infalible (o segura), es posible que cambiar MAVEN_OPTS no le ayude. Seguí probando diferentes configuraciones en MAVEN_OPTS sin suerte hasta que encontré esta publicación que solucionó el problema.

Básicamente, los JUnits se bifurcan en su propio entorno e ignoran la configuración en MAVEN_OPTS. Necesita configurar surefire en su pom para agregar más memoria para los JUnits.

¡Con suerte, esto puede ahorrarle tiempo a alguien más!


Editar: Solución de copia del blog de Keith Chapman en caso de que el enlace se rompa algún día:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <forkMode>pertest</forkMode> 
    <argLine>-Xms256m -Xmx512m</argLine>
    <testFailureIgnore>false</testFailureIgnore> 
    <skip>false</skip> 
    <includes> 
      <include>**/*IntegrationTestSuite.java</include>
    </includes>
  </configuration>
</plugin>

Actualización (31/5/2017): Gracias a @johnstosh por señalar esto, surefire ha evolucionado un poco desde que publiqué esta respuesta. Aquí hay un enlace a su documentación y una muestra de código actualizado (la línea arg sigue siendo la parte importante para esta pregunta):

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20</version>
    <configuration>
        <forkCount>3</forkCount>
        <reuseForks>true</reuseForks>
        <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
        <systemPropertyVariables>
            <databaseSchema>MY_TEST_SCHEMA_${surefire.forkNumber}</databaseSchema>
        </systemPropertyVariables>
        <workingDirectory>FORK_DIRECTORY_${surefire.forkNumber}</workingDirectory>
    </configuration>
  </plugin>

¡Me ahorró algo de tiempo! ¡Gracias! Desafortunadamente, solo puedo votar una vez. :)
javanna

Esta es la respuesta más útil entre otras, en estilo maven real. ¡Gracias!
Andremoniy

Esta es la respuesta real a la pregunta
Jonathan Landrum

1
Consulte los documentos en surefire. Las versiones surefire anteriores a 2.14 usaban el parámetro forkMode para configurar la bifurcación. Aunque ese parámetro todavía es compatible por compatibilidad con versiones anteriores, se recomienda encarecidamente a los usuarios que migren su configuración y usen forkCount y reuseForks en su lugar.
johnstosh

21

Debe ser el mismo comando, excepto SET en lugar de EXPORT

  • set MAVEN_OPTS = -Xmx512m le daría 512Mb de montón
  • set MAVEN_OPTS = -Xmx2048m le daría 2 Gb de montón

Estoy de acuerdo en que debería ser el mismo comando, pero eso no lo convierte en una declaración verdadera, aquí está la razónC:\my_project>MAVEN_OPTS=-Xmx512m 'MAVEN_OPTS' is not recognized as an internal or external command, operable program or batch file.
Gandalf StormCrow

glowcoder está un poco mal. No es necesario EXPORTAR las variables, pero para asignarles un valor sí es necesario establecerlas.
JeremyP

También puede establecer MAVEN_OPTS como una variable de entorno de Windows si desea utilizar los mismos valores para cada compilación.
digitaljoel

@Gandalf necesitas poner el conjunto delante de él @Jeremy sí, es por eso que dice usar conjunto en lugar de exportar
corsiKa

9

En Mac: en lugar de JAVA_OPTSy MAVEN_OPTS, usa _JAVA_OPTIONS. ¡Esto funciona!


esto también funciona en Windows. Agregue esto como una variable de entorno en la configuración de ejecución de maven en eclipse, las pruebas que se ejecutan desde m2e ya no dan error de PermGen
fedeb

3

Después de intentar usar la variable MAVEN_OPTS sin suerte, encontré este sitio que funcionó para mí. Así que todo lo que tuve que hacer fue agregar -Xms128m -Xmx1024m a las opciones predeterminadas de VM y funcionó.

Para cambiarlos en Eclipse, vaya a Ventana -> Preferencias -> Java -> JRE instalados. Seleccione el JRE / JDK marcado y haga clic en editar.


0

En ventanas:

Agregue una variable de entorno (en las variables del sistema y del usuario, tengo un problema extraño, que obtiene la var de varios lugares, así que los agrego en ambos).

Nómbrelo MAVEN_OPTS.

El valor será: -Xms1024m -Xmx3000m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled

Los números pueden ser diferentes, hágalos en relación con el tamaño de su memoria.

Tuve ese problema y esto lo solucionó, ¡nada más!


0

Funcionó: para cambiar en Eclipse, vaya a Ventana -> Preferencias -> Java -> JRE instalados. Seleccione el JRE / JDK marcado y haga clic en editar.

Argumentos de VM predeterminados = -Xms128m -Xmx1024m


-7

Busca 2 opciones para java:

  • -Xmx tamaño de pila máximo
  • -Xms tamaño de pila inicial

Colóquelos en la invocación de la línea de comandos del javaejecutable, así:

java -Xms512M -Xmx1024M my.package.MainClass

Tenga en cuenta que es posible que desee que los tamaños de montón inicial y máximo sean los mismos, según la aplicación, ya que evita cambiar el tamaño del montón durante el tiempo de ejecución (lo que puede llevar tiempo en las aplicaciones que deben responder). Cambiar el tamaño del montón puede implicar mover muchos objetos y rehacer la contabilidad.

Para proyectos de todos los días, conviértalos en lo que crea que sea lo suficientemente bueno. Perfil de ayuda.


1
como afirma ebelisle, estas opciones no funcionarían en absoluto, ya que usted, usando Maven, tiene que especificar al menos que es una opción de Maven con "-D" pero todavía no es un comando de Java de lo que estamos hablando
frandevel
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.