Falha na compilação de falta de memória do Maven

88

A partir de hoje, minha compilação de maven falha.

[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] Sem memória; para aumentar a quantidade de memória, use o sinalizador -Xmx na inicialização (java -Xmx128M ...)

Até ontem eu tinha executado com sucesso uma compilação do maven.

A partir de hoje, aumentei minha pilha para 3 GB . Além disso, alterei apenas 2 a 3 linhas secundárias de código, por isso não compreendo este erro de 'falta de memória'.

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

EDIT: Eu tentei o comentário do autor alterando o pom.xml do meu módulo com falha. Mas eu tenho o mesmo erro de compilação do 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
fonte
1
Você poderia fornecer mais do rastreamento de pilha? Estou curioso para ver o que pode estar fazendo com que uma inicialização de String fique sem memória. Definir o tamanho do heap em MAVEN_OPTS parece o caminho a seguir, mas meu palpite é que em algum lugar há uma String ridiculamente grande para a qual você pode não estar alocando o suficiente -Xmx.
Edward Samson

Respostas:

136

De que tipo de módulo 'web' você está falando? É uma guerra simples e tem uma guerra de tipo de embalagem?

Se você não estiver usando o kit de ferramentas da web do Google (GWT), não precisa fornecer gwt.extraJvmArgs

Bifurcar o processo de compilação pode não ser a melhor ideia, porque ele inicia um segundo processo que ignora MAVEN_OPTS completamente, tornando a análise mais difícil.

Então, eu tentaria aumentar o Xmx configurando o MAVEN_OPTS

export MAVEN_OPTS="-Xmx3000m"

E não bifurque o compilador para um processo diferente

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

O aumento -XX:MaxPermSize=512mnão deve ser necessário porque se o tamanho do permanente for a razão do problema, então eu esperaria o errojava.lang.OutOfMemoryError: PermGen space

Se isso não resolver seu problema, você pode criar dumps de heap para análise posterior adicionando -XX:+HeapDumpOnOutOfMemoryError. Além disso, você pode usar jconsole.exe em seu diretório bin java para se conectar ao jvm enquanto a compilação está em execução e ver o que está acontecendo dentro do heap do jvm.

Outra ideia (pode ser estúpida) que me ocorreu, você tem memória RAM suficiente dentro de sua máquina? Definir o tamanho da memória é bom, mas se seu host tiver apenas 4 GB e então você pode ter o problema de que o Java não é capaz de usar a memória definida porque ela já é usada pelo sistema operacional, Java, MS-Office ...

vach
fonte
Obrigado pela sua resposta. Sua sugestão de remover a JVM bifurcada também se aplica ao 'maven-surefire-plugin?' Tentei sua sugestão para aumentar minha memória MAVEN_OPTS para 3000. Meu compilador maven não tinha uma configuração para uma JVM bifurcada, então não precisei alterar nada lá. E sim, minha VM Convidada tem 4 GB de RAM. A máquina host possui 8 GB de RAM.
Kevin Meredith
2
a propósito, a compilação do mvn falhou novamente com suas sugestões.
Kevin Meredith
1
Normalmente, tento evitar a bifurcação do processo, desde que não o faça funcionar. Se o seu sistema tiver apenas 4 GB, ~ 1 GB será usado pelo sistema operacional. Então você tem 3 GB de descanso. Se o maven começar com Xms = 1 GB, o restante da memória livre será de 2 GB. Em seguida, a bifurcação do compilador começou com Xms = 1 GB ... que reduz a memória livre para 1 GB. Agora você pode subtrair a memória PermGen de 128 MB, o processo de plug-in à prova de falhas bifurcado, ... Como você pode ver, sua configuração Xmx provavelmente nunca poderia ser usada na JVM, pois a memória é simples e não está livre. Você já tentou usar o JConsole? e HeapDumpOnOutOfMemoryError?
vach
Eu removi o Xms1024m do meu MAVEN_OPTS, mas a compilação do mvn ainda falhou. Eu adicionei o "HeapDump ..." ao meu MAVEN_OPTS, mas não tenho certeza de onde o dump é impresso. Olhando para o JConsole agora.
Kevin Meredith
Os despejos são colocados no diretório
jvms
36

Respondendo tarde para mencionar outra opção em vez da MAVEN_OPTSvariável de ambiente comum para passar para o Maven construir as opções de JVM necessárias.

Desde o Maven 3.3.1 , você pode ter uma .mvnpasta como parte do projeto em questão e um jvm.configarquivo como local perfeito para tal opção.

dois novos arquivos de configuração opcionais .mvn/jvm.confige .mvn/maven.config, localizados no diretório base da árvore de origem do projeto. Se presentes, esses arquivos fornecerão as opções jvm e maven padrão. Como esses arquivos fazem parte da árvore de origem do projeto, eles estarão presentes em todos os checkouts do projeto e serão usados ​​automaticamente sempre que o projeto for compilado.

Como parte das notas de lançamento oficiais

No Maven, não é simples definir a configuração da JVM por projeto. O mecanismo existente baseado em uma variável de ambiente MAVEN_OPTSe o uso de ${user.home}/.mavenrcé outra opção com a desvantagem de não fazer parte do projeto.

A partir desta versão, você pode definir a configuração da JVM por meio de um ${maven.projectBasedir}/.mvn/jvm.configarquivo, o que significa que você pode definir as opções para sua construção por projeto. Este arquivo se tornará parte de seu projeto e será verificado junto com seu projeto. Portanto, não mais precisa para MAVEN_OPTS, .mavenrcarquivos. Por exemplo, se você colocar as seguintes opções de JVM no ${maven.projectBasedir}/.mvn/jvm.configarquivo:

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

A principal vantagem dessa abordagem é que a configuração é isolada para o projeto em questão e aplicada a toda a construção também, e menos frágil do que MAVEN_OPTSpara outros desenvolvedores trabalhando no mesmo projeto (esquecendo-se de defini-la).
Além disso, as opções serão aplicadas a todos os módulos no caso de um projeto multimódulo.

A_Di-Matteo
fonte
2
Observe que MaxPermSize será ignorado se você estiver usando JDK 8.
GeraldScott
14

Eu tenho o mesmo problema ao tentar compilar "instalação limpa" usando um VPS Lowend 512Mb de RAM e bom CPU. Execute OutOfMemory e matou o script repetidamente.

Usei export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"e trabalhei.

Ainda estou recebendo alguma outra falha de compilação porque é a primeira vez que preciso do Maven, mas o problema de OutOfMemory desapareceu.

m3nda
fonte
11

Adicionar opção

-XX:MaxPermSize=512m

para MAVEN_OPTS

maven-compiler-plugin opções

  <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
fonte
2
Na verdade, adicionei a opção -XX: MaxPermSize = 1024m, depois de fazer este post. Mas ainda recebo um erro de falta de memória. Outro post do SO mencionou que preciso adicionar uma opção ao argLine do maven-surefire-plugin para aumentar a memória usada por threads bifurcados. Eu aumentei para <argLine> -Xms256m -Xmx1024m -XX: PermSize = 128m -XX: MaxPermSize = 512m </argLine>
Kevin Meredith
Eu deveria ter mencionado isso ... Não, a construção de maven ainda falhou.
Kevin Meredith
Adicionar todas essas propriedades maven-compilier-plugine aumentar -XX:MaxPermSize, Xmxdeve ser =XX:MaxPermSize
Ilya
Use também a opção <fork> true </true> emmaven-compilier-plugin
Ilya
Eu tentei isso (por favor, veja a postagem original), mas minha compilação de mvn ainda falhou.
Kevin Meredith de
4

Tive o mesmo problema ao compilar o Druid.io, aumentando o MaxDirectMemorySize finalmente funcionou.

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
hahakubile
fonte
Curioso, MaxDirectMemorySize é ostensivamente ilimitado por padrão (ou seja, você adicionou um limite, não ajustou um pré-existente).
Tomer Gabel
4

Esta configuração abaixo está funcionando no meu 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>

Tente usar -XX: MaxPermSize em vez de -XX: MaxPermGen

Narayan Yerrabachu
fonte
4
_JAVA_OPTIONS="-Xmx3G" mvn clean install
Gerenciador de Dispositivos
fonte
3

Em que tipo de sistema operacional você está executando?

Para atribuir mais de 2 GB de RAM, ele precisa ter pelo menos um sistema operacional de 64 bits.

Então, há outro problema. Mesmo se o seu sistema operacional tiver RAM ilimitada, mas fragmentada de forma que nenhum bloco livre de 2 GB esteja disponível, você também obterá exceções de memória insuficiente. E tenha em mente que a memória Heap normal é apenas parte da memória que o processo VM está usando. Portanto, em uma máquina de 32 bits, você provavelmente nunca será capaz de definir Xmx para 2048 MB.

Eu também sugeriria definir min e max memory com o mesmo valor, porque, neste caso, assim que a VM ficar sem memória, o primeiro tempo de 1 GB é alocado desde o início, a VM então aloca um novo bloco (assumindo que aumente com Blocos de 500 MB) de 1,5 GB depois de alocado, ele copia todo o material do bloco um para o novo e libera memória depois disso. Se ficar sem memória novamente, os 2 GB são alocados e os 1,5 GB são copiados, alocando temporariamente 3,5 GB de memória.

Christofer Dutz
fonte
1

Ao construir o projeto na plataforma Unix / Linux, defina a sintaxe de opções do Maven conforme abaixo. Observe que sinais de qoutação única, não qoutação dupla.

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

Usar .mvn / jvm.config funcionou para mim e tem a vantagem adicional de estar vinculado ao projeto.

Colinbes
fonte
0

Isso acontece em grandes projetos no Windows quando cygwin ou outro emulador de linux é usado (git bash). Por alguma coincidência, ambos não funcionam no meu projeto, que é um grande projeto de código aberto. Em um script sh, alguns comandos mvn são chamados. O tamanho da memória aumenta para um tamanho de heap maior do que o especificado em Xmx e, na maioria das vezes, no caso de um segundo processo do Windows ser iniciado. Isso está tornando o consumo de memória ainda maior.

A solução neste caso é usar o arquivo batch e o tamanho Xmx reduzido e então as operações maven serão bem-sucedidas. Se houver interesse, posso revelar mais detalhes.

zhrist
fonte
0

Alguém já mencionou o problema com o sistema operacional de 32 bits. No meu caso, o problema era que eu estava compilando com JDK de 32 bits.

user2046211
fonte
0

Aumentar o tamanho da memória na variável de ambiente 'MAVEN_OPTS' ajudará a resolver esse problema. Para mim, aumentar de -Xmx756M para -Xmx1024M funcionou.

Nidhi
fonte