Configurando o espaço de heap Java em Maven 2 no Windows

91

Eu recebo esta mensagem durante a construção do meu projeto

java.lang.OutOfMemoryError: espaço de heap Java

Como faço para aumentar o espaço de heap, tenho 8 Gb ou RAM, é impossível que o maven tenha consumido tanto, achei este http://vikashazrati.wordpress.com/2007/07/26/quicktip-how-to-increase-the -java-heap-memory-for-maven-2-on-linux / como fazer no linux, mas estou no Windows 7. Como posso alterar o espaço de heap do java no windows?

Gandalf StormCrow
fonte
Presumo que você esteja na versão de 64 bits do Windows? Caso contrário, você não vai especificar mais do que 1,5 G como o tamanho do heap, as outras janelas de 0,5 G que permitem o uso direto serão exigidas pela JVM. Há uma opção para fazer com que o Windows use apenas 1G para o código do modo kernal e 3G para o código do modo do usuário, mas o Sun JVM não permite que você o use.
vickirk
@vickirk Estou na versão de 64 bits do Windows
Gandalf StormCrow
1
Você também está usando uma versão de 64 bits da JVM? Ele será listado como Windows x64 na lista suspensa na página de download do JDK: java.sun.com/javase/downloads/widget/jdk6.jsp
Powerlord

Respostas:

117

A variável de ambiente a definir é MAVEN_OPTS, por exemplo MAVEN_OPTS=-Xmx1024m. A maxmemconfiguração no pom só se aplica quando você define o plug-in do compilador para bifurcar javacem uma nova JVM. Caso contrário, o plugin é executado dentro da mesma VM que o Maven e, portanto, dentro da memória passada na linha de comando por meio do MAVEN_OPTS.

Para definir MAVEN_OPTS no Windows 7:

  1. Clique com o botão direito em Meu Computador e selecione Propriedades (atalho de teclado pressione Windows+ Pause/Break)
  2. Clique no link Configurações avançadas do sistema localizado na navegação esquerda de Propriedades do sistema para exibir as Propriedades avançadas do sistema
  3. Vá para a guia Avançado e clique no botão Variáveis ​​de Ambiente localizado na parte inferior da janela de configuração Propriedades Avançadas do Sistema
  4. Crie uma nova variável de usuário, defina o nome da variável para MAVEN_OPTS e defina o valor da variável para -Xmx1024m(ou mais)

Abra uma nova janela de comando e execute mvn.

Pascal Thivent
fonte
1
Isso tem algum impacto na velocidade de minha construção? Existe alguma dica para aumentar minha compilação de maven com a alocação de mais memória para ela?
Mahendran
45

Se você estiver ficando sem espaço de heap durante a execução do teste JUnit infalível (ou à prova de falhas), alterar MAVEN_OPTS pode não ajudá-lo. Continuei tentando configurações diferentes no MAVEN_OPTS sem sorte até encontrar este post que corrigiu o problema.

Basicamente, os JUnits entram em seu próprio ambiente e ignoram as configurações em MAVEN_OPTS. Você precisa configurar o surefire em seu pom para adicionar mais memória para os JUnits.

Esperançosamente, isso pode economizar algum tempo para outra pessoa!


Edit: Copiando solução do blog de Keith Chapman apenas no caso de o link quebrar algum dia:

<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>

Atualização (31/05/2017): Obrigado a @johnstosh por apontar isso - o infalível evoluiu um pouco desde que coloquei esta resposta lá. Aqui está um link para a documentação e um exemplo de código atualizado (a linha arg ainda é a parte importante para esta questão):

  <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>
Letreiro
fonte
Isso economizou algum do meu tempo! Obrigado! Infelizmente, só posso votar positivamente uma vez! :)
javanna de
Esta é a resposta mais útil entre outras, no verdadeiro estilo maven. Obrigado!
Andremoniy
Esta é a resposta real para a pergunta
Jonathan Landrum
1
Veja a documentação infalível. as versões surefire anteriores a 2.14 usavam o parâmetro forkMode para configurar a bifurcação. Embora esse parâmetro ainda tenha suporte para compatibilidade com versões anteriores, os usuários são fortemente encorajados a migrar sua configuração e usar forkCount e reuseForks.
johnstosh
21

Deve ser o mesmo comando, exceto SET em vez de EXPORT

  • set MAVEN_OPTS = -Xmx512m daria 512 MB de heap
  • set MAVEN_OPTS = -Xmx2048m daria 2 Gb de heap
CorsiKa
fonte
Eu concordo que deveria ser o mesmo comando, mas isso não significa que seja uma afirmação verdadeira, aqui está o porquêC:\my_project>MAVEN_OPTS=-Xmx512m 'MAVEN_OPTS' is not recognized as an internal or external command, operable program or batch file.
Gandalf StormCrow
O codificador de brilho está ligeiramente errado. Você não precisa EXPORTAR as variáveis, mas para atribuir um valor a elas, você precisa definir.
JeremyP
Você também pode definir MAVEN_OPTS como uma variável de ambiente do Windows se quiser usar os mesmos valores para cada construção.
digitaljoel
@Gandalf você precisa colocar o conjunto na frente dele @Jeremy sim, é por isso que diz para usar o conjunto em vez de exportar
corsiKa
9

No Mac: em vez de JAVA_OPTSe MAVEN_OPTS, use _JAVA_OPTIONS. Isso funciona!

Steve
fonte
isso também funciona no Windows. Adicione isso como uma variável de ambiente na configuração de execução do maven no eclipse, os testes executados a partir de m2e não dão mais erro de
PermGen
3

Depois de tentar usar a variável MAVEN_OPTS sem sorte, me deparei com este site que funcionou para mim. Então, tudo que tive que fazer foi adicionar -Xms128m -Xmx1024m às opções padrão da VM e funcionou.

Para alterá-los no Eclipse, vá para Janela -> Preferências -> Java -> JREs instalados. Selecione o JRE / JDK marcado e clique em editar.

kent_e
fonte
0

Em janelas:

Adicione uma variável de ambiente (nas variáveis ​​de sistema e de usuário, estou com um problema estranho, que obtém a var de vários lugares, então eu adiciono em ambas).

Nomeie-o MAVEN_OPTS.

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

Os números podem ser diferentes, faça-os em relação ao tamanho da memória.

Eu tive esse problema e isso resolveu, nada mais!

Hrabia
fonte
0

Funcionou - para mudar no Eclipse, vá para Janela -> Preferências -> Java -> JREs instalados. Selecione o JRE / JDK marcado e clique em editar.

Argumentos VM padrão = -Xms128m -Xmx1024m

Anadi Kumar
fonte
-6

Você está procurando 2 opções para java:

  • -Xmx tamanho máximo de heap
  • -Xms de tamanho de heap inicial

Coloque-os em sua invocação de linha de comando do javaexecutável, assim:

java -Xms512M -Xmx1024M my.package.MainClass

Lembre-se de que você pode querer que os tamanhos de heap inicial e máximo sejam iguais, dependendo do aplicativo, pois isso evita o redimensionamento do heap durante o tempo de execução (o que pode demorar em aplicativos que precisam responder). O redimensionamento do heap pode envolver mover vários objetos e refazer a contabilidade.

Para projetos do dia-a-dia, transforme-os no que você achar que é bom o suficiente. Perfil para obter ajuda.

Phil
fonte
1
como afirma ebelisle, esta opção não funcionaria porque você, usando Maven, tem que especificar pelo menos que é uma opção Maven com "-D" mas ainda não é um comando java do que estamos falando
frandevel