Não foi possível reservar espaço suficiente para o heap do objeto

277

Estou recebendo a seguinte exceção repetidamente cada vez que tento executar o programa.

Ocorreu um erro durante a inicialização da VM

Não foi possível reservar espaço suficiente para o heap do objeto

Não foi possível criar a máquina virtual Java.

Tentei aumentar minha memória virtual (tamanho da página) e tamanho da RAM, mas sem sucesso.

Como posso eliminar esse erro?

Narendra
fonte
2
Também recebo esse erro ao usar o jdk / jre 1.6 na minha máquina virtual, tentei alterar os valores de configuração fornecidos nos comentários, mas isso não estava ajudando. Após a atualização para o jdk 1.7, o erro desapareceu e foram aplicados parâmetros Xmx maiores. Parece que há muitas alterações no uso de heap desde o java 1.6.
Alexander.Iljushkin

Respostas:

214

Execute a JVM com -XX:MaxHeapSize=512m(ou qualquer número grande conforme necessário) (ou -Xmx512mabreviado)

Bozho
fonte
42
Ou os mais curtos, -mx256m ou -mx512m;) #
9788 Peter Lawrey
8
-Mx é o mesmo que -Xmx e -XX: MaxHeapSize?
Erty Seidohl
19
Obrigado .. Acontece que um número muito grande também pode ser um problema e pode dar o mesmo erro!
Dinesh Rajan
17
Alguém encontrou uma solução que realmente funciona 100% do tempo? Esta solução resolve o problema temporariamente, mas de repente ele volta. Eu tenho 16 GB de RAM e estou cansado desse merda. Tudo estava melhor nos velhos tempos: [
Nilzor 01/10/1914
6
Não funciona para mim no Windows 8 com Java x86 ou x64.
precisa
128

Isso também pode ser causado pela configuração de algo muito grande em um HotSpot vm de 32 bits, por exemplo:

-Xms1536m -Xmx1536m

onde isso pode / iria funcionar:

-Xms1336m -Xmx1336m
djangofan
fonte
5
Esqueci de mencionar que esse problema teria que ocorrer durante o lançamento em um shell de comando de 32 bits. Um shell de comando de 64 bits pode não ter esse problema.
djangofan
Para mim, falhou com o valor padrão e com um valor muito grande, portanto, tente vários valores. Obrigado pela resposta!
Trax
47

aqui está como corrigi-lo:

  • Vá para Iniciar-> Painel de Controle-> Sistema-> Avançado (guia) -> Variáveis ​​de Ambiente-> Sistema

    Variáveis-> Novo: Nome da _JAVA_OPTIONS variável: Valor da -Xmx512M variável: Nome da Path
    variável: Valor da variável:%PATH%;C:\Program Files\Java\jre6\bin;F:\JDK\bin;

Mude isso para o caminho apropriado.

Mohamed Adel
fonte
1
Bem parecido com esta resposta , eu diria ...
That1Guy 20/05
Um bom. Junto com o acima, consulte este também. stackoverflow.com/a/9350506/967638
Amarnath
46

Eu me deparei com isso ao usar o javac, e ele não parece ser exibido nas opções da linha de comando,

-bash-3.2$ javac -Xmx256M HelloWorldApp.java 
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

então a solução aqui é assim que você define _JAVA_OPTIONS

-bash-3.2$ export _JAVA_OPTIONS="-Xmx256M"
-bash-3.2$ javac HelloWorldApp.java 
Picked up _JAVA_OPTIONS: -Xmx256M

E isso compila bem.

Isso acontece comigo em máquinas com muita RAM, mas com ulimits de memória mais baixos. O Java decide alocar um grande heap porque detecta a ram na máquina, mas não é permitido alocá-lo por causa de ulimits.

Jens Timmerman
fonte
1
+1 para apontar _JAVA_OPTIONS - no meu caso, o java é chamado de algum lugar no interior de um script de shell ao qual não tenho acesso de gravação, portanto, essa opção é preferível.
Gerrit 15/05
O mesmo aqui. Estou usando computadores da universidade, portanto não sou administrador (não posso alterar variáveis ​​ambientais) e a opção de linha de comando não estava funcionando. Muito obrigado!
21417 Kimbluey
38

Java de 32 bits requer espaço livre contíguo na memória para ser executado. Se você especificar um tamanho grande de heap, talvez não haja muito espaço livre contíguo na memória, mesmo se você tiver muito mais espaço livre disponível do que o necessário.

A instalação de uma versão de Java de 64 bits ajuda nesses casos, os requisitos de memória contíguos se aplicam apenas ao Java de 32 bits.

JohnEye
fonte
1
Eu acho que essa é a melhor resposta caso você continue recebendo o erro depois de usar a opção -Xmx [bignumber] m. Ajudou-me a executar o Apache jMeter corretamente.
RuudvK
Eu criei um novo projeto da marca, com nenhum código que não seja o auto gerado principal atividade, e produziu este erro
behelit
1
Eu segundo @RuudvK. A instalação de 64 bits me permitiu aumentar a memória máxima enquanto limpava o erro de alocação de memória. Essa deve ser a resposta aceita.
precisa saber é o seguinte
28

Combinado com -Xmx512M, use -d64 para garantir que você esteja executando a VM de 64 bits. Em uma máquina de 64 bits, pensei com certeza que estava executando uma máquina virtual de 64 bits, mas não. Após a instalação do Java de 64 bits, a opção -d64 funciona e o -Xmx permite tamanhos de memória muito maiores.

java -d64 -Xmx512M mypackage.Test
Axl
fonte
4
Esta resposta deve estar no topo. Passou dois meses battleing esta questão, apenas para perceber que a instalação de 64 bits Java resolveu o problema (a opção -d64 não era necessário no meu caso)
Nilzor
Pegada _JAVA_OPTIONS: -d64 -Xmx1024M Opção não reconhecida: -d64 A JVM não pôde ser iniciada. O tamanho máximo do heap (-Xmx) pode ser muito grande ou uma ferramenta antivírus ou firewall pode bloquear a execução.
Alexander
14

Eu recebi o mesmo erro e resolvi isso configurando-o no run.conf.bat

Execute a JVM com o arquivo run.conf.bat em Jboss5x

Se a memória livre não estiver disponível, conforme você estiver passando na instrução, faça alterações no run.conf.bat

set "JAVA_OPTS=-Xms512m -Xmx512m -XX:MaxPermSize=256m"
Ankam shyamsundar
fonte
7

Eu sei que já existem muitas respostas aqui, mas nenhuma delas me ajudou. No final, abri o arquivo /etc/elasticsearch/jvm.optionse mudei:

-Xms2G
-Xmx2G

para

-Xms256M
-Xmx256M

Isso resolveu para mim. Espero que isso ajude alguém aqui.

kramer65
fonte
7

Eu tive problemas semelhantes. Eu instalei a versão de 32 bits do Java em uma máquina de 64 bits.

Desinstalando essa versão e instalando a versão de 64 bits do Java. Consegui resolver o problema.

Manu Sharma
fonte
6

Suponha que sua classe seja chamada Testno pacote mypackage. Execute seu código assim:

java -Xmx1024m mypackage.Test

Isso reservará 1024 MB de espaço de heap para o seu código. Se você quer 512 MB, pode usar:

java -Xmx512m mypackage.Test

Use pouco m na 1024m, 512metc.

euphoria83
fonte
6

Às vezes, esse erro indica que a memória física e a troca no servidor são realmente utilizadas!

Eu estava vendo esse problema recentemente em um servidor executando o RedHat Enterprise Linux 5.7 com 48 GB de RAM. Eu descobri que mesmo correndo

java -version

causou o mesmo erro, que estabeleceu que o problema não era específico do meu aplicativo.

Corrida

cat /proc/meminfo

relataram que MemFree e SwapFree estavam bem abaixo de 1% dos valores MemTotal e SwapTotal, respectivamente:

MemTotal:     49300620 kB
MemFree:        146376 kB
...
SwapTotal:     4192956 kB
SwapFree:         1364 kB

A interrupção de alguns outros aplicativos em execução na máquina trouxe um pouco à memória livre:

MemTotal:     49300620 kB
MemFree:       2908664 kB
...
SwapTotal:     4192956 kB
SwapFree:      1016052 kB

Nesse ponto, uma nova instância do Java seria iniciada corretamente e eu era capaz de executar meu aplicativo.

(Obviamente, para mim, essa foi apenas uma solução temporária; ainda tenho uma tarefa extraordinária de fazer um exame mais minucioso dos processos em execução nessa máquina para ver se há algo que pode ser feito para reduzir os níveis de utilização de memória nominal, sem ter que recorrer à interrupção dos aplicativos.)

Jon Schneider
fonte
O mesmo aqui, java -versionfalhando, mesmo que o top tenha mostrado ainda alguns de graça: | (também disse que Ocorreu um erro durante a inicialização da VM. Às vezes, não era possível reservar espaço suficiente para a matriz de marcação de cartões). A correção parecia ser a melhor, procurar quais processos estavam usando mais RAM (coluna VIRT) e matá-los [postgres, appdynamics para mim]: |
Rogerdpack # 24/16
Isso pode ser devido à fragmentação da memória? Uma resposta acima menciona espaço livre contíguo.
Rick Moritz
6

Erro:

Para o erro, "o erro ocorreu durante a inicialização do vm não pôde reservar espaço suficiente para o heap do objeto jboss"

Causa raiz :

  • Alocação de memória inadequada / insuficiente para nossa JVM, conforme mencionado abaixo.

  • por exemplo, JAVA_OPTS = "- Xms1303m -Xmx1303m -XX: MaxPermSize = 256m" no jboss-eap-6.2 \ bin \ standalone.conf ou "JAVA_OPTS = -Xms1G -Xmx1G -XX: MaxPermSize = 256M" no jboss-eap-6.2 \ bin \ standalone.conf.bat que nada mais é que parâmetros do conjunto de alocação de memória da JVM.

Resolução:

  • Aumente o tamanho da pilha. Para aumentar o tamanho da pilha,
  • goto -> jboss-eap-6.2 \ bin \ standalone.conf.bat ou jboss-eap-6.2 \ bin \ standalone.conf
  • change -> JAVA_OPTS = "- Xms256m -Xmx512m -XX: MaxPermSize = 256m" em que -Xms é o tamanho mínimo de heap e -Xmx é o tamanho máximo de heap.
  • Normalmente, não é recomendável ter o mesmo tamanho para min e max.

  • Se você estiver executando seu aplicativo a partir do eclipse,

  • Clique duas vezes no servidor
  • selecione 'abrir configuração de inicialização', você será redirecionado para a janela 'Editar propriedades de configuração de inicialização'.
  • Nesta janela, vá para a aba '(x) = Argumentos'.
  • Nos argumentos da VM, defina o tamanho do heap conforme mencionado abaixo
  • "-Dprogram.name = JBossTools: Servidor de Tempo de Execução do JBoss EAP 6.1+" -server -Xms256m -Xmx512m -XX: MaxPermSize = 256m -Dorg.jboss.resolver.warning = true
Prabhakar
fonte
Uma citação da Oracle Command Line Reference : " Para obter o melhor desempenho, defina -Xms para o mesmo tamanho que o tamanho máximo de heap, por exemplo:java -Xgcprio:throughput -Xmx:64m -Xms:64m myApp "
user1438038
3

Recentemente, enfrentei esse problema. Eu tenho 3 aplicativos java que começam com o tamanho de heap de 1024m ou 1280m. Java está observando o espaço disponível no swap e, se não houver memória suficiente disponível, a jvm será encerrada.

Para resolver o problema, tive que encerrar vários programas que tinham uma grande quantidade de memória virtual alocada.

Eu estava executando no x86-64 linux com uma jvm de 64 bits.

codeDr
fonte
3

Eu tinha a quantidade certa de configurações de memória, mas para mim estava usando um intellij de 64 bits com jvm de 32 bits. Depois que mudei para a VM de 64 bits, o erro desapareceu.

vsingh
fonte
2

Supondo que você tenha memória livre suficiente e configure os argumentos da JVM corretamente, você pode ter um problema de fragmentação da memória. Verifique a memória máxima do Java no Windows XP .

daramasala
fonte
2

Se você estiver executando a JVM de 32 bits, alterar o tamanho da pilha para menor provavelmente ajudaria. Você pode fazer isso passando args para java diretamente ou através de variáveis ​​de ambiente como a seguir,

java -Xms128M -Xmx512M
JAVA_OPTS="-Xms128M -Xmx512M"

Para JVM de 64 bits, tamanho de heap maior, como -Xms512M -Xmx1536M deve funcionar.

Execute java -versionou java -d32, java--d64para Java7, para verificar qual versão você está executando.

h - n
fonte
1

De qualquer forma, aqui está como corrigi-lo: Vá para Iniciar-> Painel de controle-> Sistema-> Avançado (guia) -> Variáveis ​​de ambiente-> Variáveis ​​de sistema-> Novo: Nome da variável: _JAVA_OPTIONS Valor da variável: -Xmx512M

OU

Mude a chamada da formiga como mostrado abaixo.

   <exec
        **<arg value="-J-Xmx512m" />**
    </exec>

Funcionou para mim.

Sudhakar
fonte
1

Ocorreu um erro durante a inicialização da VM Não foi possível reservar espaço suficiente para o heap de objeto 1572864KB

Alterei o valor da memória no arquivo settings.grade 1536 para 512 e isso ajudou

Haris Durrani
fonte
1

Vá para Iniciar-> Painel de Controle-> Sistema-> Avançado (guia) -> Variáveis ​​de Ambiente-> Variáveis ​​do Sistema-> Novo:

Variable name: _JAVA_OPTIONS
Variable value: -Xmx512M
El mehdi AZROUR
fonte
Definir isso globalmente limita o tamanho da pilha que você pode fornecer ao IntelliJ.
user3056052
0

Caso você esteja executando um programa java: - execute o programa em um terminal usando o comando correto para linux, seria 'java -jar myprogram.jar' e adicione -Xms256m -Xmx512m, por exemplo: 'java -jar myprogram.jar Xms256m -Xmx512m '

Caso esteja executando um script .sh (linux, mac?) Ou .bat (windows), abra o script e procure as opções de java, se estiverem presentes, e aumente a memória.

Se tudo isso não funcionar, verifique seus processos (ctrl + alt + delete no Windows) (ps aux no linux / mac) e elimine os processos que usam muito espaço de memória e não são necessários para o seu sistema operacional! => Tente executar novamente o seu programa.

Fico
fonte
0

Em CASSANDRA_HOME / bin / cassandra.bat, você encontraria a seguinte configuração

REM JVM Opts we'll use in legacy run or installation
set JAVA_OPTS=-ea^
 -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.3.0.jar"^
 -Xms**2G**^
 -Xmx**2G**^

Você pode reduzir 2G para um número menor, por exemplo, 1G ou até menor e deve funcionar.

Mesmo se você estiver executando na caixa unix, altere o arquivo .sh adequadamente.

Deepak Singhvi
fonte
0

Eu recebi o mesmo erro e ele foi resolvido quando excluí arquivos temporários usando% temp% e reiniciando o eclipse.

Viswanath Nuggu
fonte
0

Às vezes se relaciona como

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 2

Se você configurá-lo para:

$ sysctl vm.overcommit_memory=0

Deveria funcionar.

kay
fonte
0

Substitua -Xmx2Gpor -Xms512Mou qualquer tamanho de memória maior no arquivo cassandra.bat no diretório cassandra bin.

Kiran
fonte
0

Abra o arquivo gradle.properties na pasta android.

Substitua esta linha:

org.gradle.jvmargs=-Xmx1536M

com:

org.gradle.jvmargs=-Xmx512m

Explicação: Limite máximo do documento Gradle:

Se o ambiente de construção solicitado não especificar um tamanho máximo de heap, o Daemon usará até 512 MB de heap.

amor ao vivo
fonte
-2

Não há necessidade de fazer nada apenas chnage no arquivo POM como abaixo

<configuration>
    <maxmemory>1024M</maxmemory>
</configuration>
Harish
fonte
2
Quem disse alguma coisa sobre um arquivo POM?
Henley Chiu