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?


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.


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>

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

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!


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.


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!


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


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.