Como lidar com " java.idioma.Erro OutOfMemoryError: Java heap space " (Tamanho de heap 64MB)

estou a escrever uma aplicação do lado do cliente Swing (desenhador gráfico de tipos de letra) em Java 5. Recentemente, eu estou correndo em java.lang.OutOfMemoryError: Java heap space erro porque eu não estou sendo conservador no uso da memória. O usuário pode abrir um número ilimitado de arquivos, e o programa mantém os objetos abertos na memória. Depois de uma pesquisa rápida eu encontrei Ergonomia na máquina virtual Java 5.0 e outros que dizem na máquina Windows o JVM usa o tamanho máximo de heap como 64MB.

situação, como devo lidar com esta restrição?

Eu poderia aumentar o tamanho máximo do heap Usando a opção da linha de comandos para java, mas isso exigiria descobrir a RAM disponível e escrever algum programa ou programa de lançamento. Além disso, aumentar para algum finito max não acaba por se livrar do problema.

Eu poderia reescrever algum do meu código para persistir objetos para o sistema de arquivos com freqüência (usar banco de dados é a mesma coisa) para liberar a memória. Pode funcionar, mas ... provavelmente também dá muito trabalho.

Se me pudesse indicar os detalhes das ideias acima ou algumas alternativas como memória virtual automática, estendendo dinamicamente o tamanho do heap , isso seria óptimo.

Author: Bhaskara Arani, 2008-09-01

18 answers

Em última análise, você sempre tem um máximo finito de heap para usar não importa em que plataforma você está executando. No Windows 32 bit isso é em torno de 2gb (não especificamente heap, mas a quantidade total de memória por processo). Acontece que Java escolhe fazer o padrão menor (presumivelmente para que o programador não possa criar programas que tenham alocação de memória fugitiva sem correr para este problema e ter que examinar exatamente o que eles estão fazendo).

Então, dado que existem vários abordagens que você pode tomar para determinar a quantidade de memória que você precisa ou para reduzir a quantidade de memória que você está usando. Um erro comum com linguagens coletadas de lixo como Java ou C# é manter em torno de referências a objetos que você já não está usando, ou alocando muitos objetos quando você poderia reutilizá-los. Enquanto os objetos têm uma referência a eles eles vão continuar a usar o espaço heap como o coletor de lixo não vai apagá-los.

Neste caso, pode utilizar um Memória Java profiler para determinar quais métodos no seu programa são alocar grande número de objetos e, em seguida, determinar se existe uma maneira para se certificar de que eles não são mais referenciados, ou não atribuir-lhes em primeiro lugar. Uma opção que eu usei no passado é " JMP " http://www.khelekore.org/jmp/.

Se determinar que está a atribuir estes objectos por uma razão e que precisa de manter as referências (dependendo do que está a fazer, pode ser este o caso), você só vai precisar de aumentar o tamanho máximo heap quando você iniciar o programa. No entanto, uma vez que você faça o perfil de memória e entender como seus objetos estão sendo alocados você deve ter uma idéia melhor sobre a quantidade de memória que você precisa.

Em geral, se não puder garantir que o seu programa irá correr em alguma quantidade finita de memória (talvez dependendo do tamanho da entrada), irá sempre deparar-se com este problema. Só depois de esgotar tudo isso você precisa olhar para os objetos de cache para fora para o disco etc. Neste ponto você deve ter uma razão muito boa para dizer "eu preciso de XGB de memória" para algo e você não pode trabalhar em torno dele, melhorando seus algoritmos ou padrões de alocação de memória. Geralmente, isso só será o caso para algoritmos operando em grandes conjuntos de dados (como um banco de dados ou algum programa de análise científica) e, em seguida, técnicas como caching e memória mapeada IO se tornam úteis.

 196
Author: Ben Childs, 2017-06-02 21:52:52

Execute Java com a opção da linha de comandos -Xmx, que define o Máximo do tamanho do heap.

Veja aqui para mais detalhes..

 101
Author: Dave Webb, 2013-07-11 08:42:08

Você poderia especificar por projecto quanto espaço de heap o seu projecto quer

A seguir é para Eclipse Helios/Juno / Kepler:

Clique com o botão direito do rato em

 Run As - Run Configuration - Arguments - Vm Arguments, 

Depois adicione isto

-Xmx2048m
 77
Author: allenhwkim, 2016-03-08 08:02:54

Aumentar o tamanho do Monte não é um " arranjo "é um" gesso", 100% temporário. Vai voltar a cair noutro lugar. Para evitar estas questões, escreva código de alto desempenho.

  1. utilizar variáveis locais sempre que possível.
  2. certifique-se que selecciona o objecto correcto (EX: selecção entre o texto, o StringBuffer e o StringBuilder)
  3. Utilize um bom sistema de códigos para o seu programa (Ex: usando variáveis estáticas VS variáveis não estáticas)
  4. outras coisas que podem funcionar na tua codigo.
  5. Tente mover-se com roscagem multy
 30
Author: Yohan Weerasinghe, 2017-06-02 21:58:26
No meu escritório, descobrimos que (em algumas máquinas do windows) não podíamos alocar mais de 512m para Java heap. Isto acabou por ser devido ao produto anti-vírus Kaspersky instalado em algumas dessas máquinas. Depois de desinstalar esse produto AV, descobrimos que poderíamos alocar pelo menos 1.6 gb, I. E., -Xmx1600m (m é obrigatório de outra forma que levará a outro erro "heap inicial muito pequeno") funciona.

Não faço ideia se isto acontece com outros produtos AV mas presumivelmente isso está acontecendo porque o programa AV está reservando um pequeno bloco de memória em cada espaço de endereço, impedindo assim uma única alocação realmente grande.

 28
Author: David, 2017-07-06 13:35:43
O argumento VM funcionou comigo no eclipse. Se estiver a usar a versão 3. 4 do eclipse, faça o seguinte

Vá para Run --> Run Configurations --> depois seleccione o projecto em maven build -- > depois seleccione a página " JRE " -- > depois indique -Xmx1024m.

Em alternativa, pode fazer Run --> Run Configurations --> select the "JRE" tab --> Depois Entrar -Xmx1024m

Isto deve aumentar o heap de memória para todas as compilações/projetos. O tamanho da memória acima é de 1 GB. Podes otimizar como quiseres.

 18
Author: loveall, 2015-01-12 14:50:54

SIM, com o-Xmx poderá configurar mais memória para o JVM. Para ter certeza de que você não vaza ou desperdiça memória. Tire um monte de lixo e use O analisador de memória do Eclipse para analisar o seu consumo de memória.

 15
Author: kohlerm, 2008-10-09 08:22:25

Gostaria de acrescentar recomendações da oracletiroteio de sarilho Artigo

Excepção no thread_name: java.idioma.Erro omemoryerror: Java heap space

A mensagem de detalhe Java heap space indica que o objecto não pôde ser atribuído no Java heap. Este erro não implica necessariamente uma fuga de memória

causas possíveis:

  1. edição de configuração simples , em que o tamanho indicado do heap é insuficiente para a aplicação.

  2. a aplicação é involuntariamente segurando referências a objetos, e isso impede que os objetos sejam coletados.

  3. utilização excessiva de finalizadores.

Uma outra fonte potencial deste erro surge com aplicações que fazem uso excessivo de finalizadores. Se uma classe tem um método de finalização, então objetos desse tipo não têm seu espaço recuperado no lixo tempo de recolha

Após recolha de lixo , os objectos estão em fila de espera para finalização , o que ocorre mais tarde. os finalizadores são executados por um tópico daemon que atende a fila de finalização. Se o tópico do finalizador não conseguir acompanhar a fila de finalização, então o heap Java poderia preencher e este tipo de fora do Memoryerror excepção seria lançada.

Um cenário que pode causar esta situação é quando um aplicativo cria de alta prioridade de threads que causa o finalização fila para aumentar a um ritmo mais rápido do que a taxa com que a thread do finalizador está atendendo a essa fila.
 8
Author: Ravindra babu, 2017-06-29 15:35:27

Siga os passos abaixo:

  1. Abrir catalina.sh do tomcat / bin.

  2. Chnage JAVA_OPTS para

    JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m 
    -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m 
    -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
    
  3. Reiniciar o tomcat

 7
Author: Pradip Bhatt, 2017-07-03 17:59:03
Li noutro sítio que podes tentar apanhar java.idioma.OutOfMemoryError e no bloco de captura, você pode liberar todos os recursos que você sabe que podem usar um monte de memória, conexões próximas e assim por diante, em seguida, fazer um sistema.gc () em seguida, tente novamente o que você ia fazer. {[[2]} outra maneira é esta embora, eu não sei se isto funcionaria, mas eu estou testando atualmente se funcionará em minha aplicação. A ideia é recolher lixo chamando o sistema.gc () que é conhecido por aumentar a memória livre. Pode continuar a verificar isto depois de um código de devoramento de Memória ser executado.
//Mimimum acceptable free memory you think your app needs
long minRunningMemory = (1024*1024);

Runtime runtime = Runtime.getRuntime();

if(runtime.freeMemory()<minRunningMemory)
 System.gc();
 6
Author: mwangi, 2010-08-17 08:19:44

Já enfrentei o mesmo problema do tamanho de Java heap. Eu tenho duas soluções se você estiver usando java 5 (1.5).

1st: - basta instalar o jdk1. 6 e ir para as preferências do eclipse e definir o caminho jre do jav1 1.6 como você instalou.

Verifique o seu argumento VM e deixe que seja o que for. basta adicionar uma linha abaixo de todos os argumentos presentes em argumentos VM como -Xms512m-Xmx512m-XX: MaxPermSize=...m (192m). Acho que vai funcionar...
 6
Author: Soumya Sandeep Mohanty, 2011-05-10 18:48:49

A forma mais fácil de resolver OutOfMemoryError em java é aumentar o tamanho máximo de heap usando as opções JVM -Xmx512M, Isto irá resolver imediatamente o seu erro de erro. Esta é a minha solução preferida quando eu sair do Mierror em Eclipse, Maven ou ANT durante a construção do projeto, porque com base no tamanho do projeto você pode facilmente ficar sem memória.

Aqui está um exemplo de aumentar o tamanho máximo de heap do JVM, também é melhor manter-Xmx a-XMS ração 1: 1 ou 1: 1.5 Se você está definindo o tamanho de heap na sua aplicação java.

export JVM_ARGS="-Xms1024m -Xmx1024m"

Ligação De Referência

 6
Author: chaukssey, 2012-06-20 10:34:39

Se precisar de monitorizar a sua utilização de memória durante a execução, o java.idioma.pacote de Gestão oferece MBeans que podem ser usados para monitorar as piscinas de memória em seu VM (eg, espaço eden, geração tenured, etc), e também o comportamento de coleta de lixo.

O espaço livre de heap relatado por estes MBeans irá variar muito dependendo do comportamento do GC, particularmente se a sua aplicação gerar um monte de objetos que são mais tarde GC-ed. Uma abordagem possível é monitorar o espaço livre de heap após cada full-GC, que você pode ser capaz de usar para tomar uma decisão em libertar a memória por objetos persistentes.

Em última análise, a sua melhor aposta é limitar a sua retenção de memória tanto quanto possível, enquanto o desempenho permanece aceitável. Como um comentário anterior observou, a memória é sempre limitada, mas seu aplicativo deve ter uma estratégia para lidar com a exaustão de memória.
 5
Author: Leigh, 2008-10-09 12:04:30

Lembre - se que, se precisar disto numa situação de implantação, considere a utilização do Webstart Java (com uma versão "ondisk", não a rede um-possível no Java 6u10 e mais tarde), uma vez que lhe permite especificar os vários argumentos para o JVM de forma transversal.

Caso contrário, necessitará de um lançador específico do sistema operativo que defina os argumentos de que necessita.

 3
Author: Thorbjørn Ravn Andersen, 2009-05-19 04:45:22

Por padrão para o desenvolvimento, a JVM usa pequenas dimensões e pequena configuração para outras características relacionadas com o desempenho. Mas para a produção você pode sintonizar por exemplo (além de que pode existir configuração específica do servidor de Aplicação) - > (se ainda não há memória suficiente para satisfazer o pedido e o heap já atingiu o tamanho máximo, um OutOfMemoryError irá ocorrer)

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

-XX:ParallelGCThreads=8
-XX:+CMSClassUnloadingEnabled
-XX:InitiatingHeapOccupancyPercent=70
-XX:+UnlockDiagnosticVMOptions
-XX:+UseConcMarkSweepGC
-Xms512m
-Xmx8192m
-XX:MaxPermSize=256m (in java 8 optional)

Por exemplo: na plataforma linux para a configuração de preferência do modo de produção.

Depois de baixar e configurar servidor com este caminho http://www.ehowstuff.com/how-to-install-and-setup-apache-tomcat-8-on-centos-7-1-rhel-7/

1.criar setenv.sh ficheiro na pasta /opt / tomcat/bin /

   touch /opt/tomcat/bin/setenv.sh

2.Abra e escreva estes parâmetros para definir o modo de preferência.

nano  /opt/tomcat/bin/setenv.sh 

export CATALINA_OPTS="$CATALINA_OPTS -XX:ParallelGCThreads=8"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+CMSClassUnloadingEnabled"
export CATALINA_OPTS="$CATALINA_OPTS -XX:InitiatingHeapOccupancyPercent=70"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UnlockDiagnosticVMOptions"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseConcMarkSweepGC"
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxMetaspaceSize=256M"

3.service tomcat restart

Note que o JVM usa mais memória do que apenas o heap. Por exemplo Métodos Java, stacks thread e pegas nativas são alocados na memória separado do heap, bem como JVM interno estrutura.

 3
Author: Musa, 2018-03-03 12:32:02

Se continuar a atribuir & a guardar referências ao objecto, irá preencher qualquer quantidade de memória que tenha.

Uma opção é fazer um ficheiro transparente fechar e abrir quando eles mudam de páginas (você só mantém um cursor para o ficheiro, e quando o utilizador muda de página, você fecha e limpa todos os objectos... vai fazer com que o ficheiro mude mais devagar... mas...), e talvez manter apenas 3 ou 4 arquivos na memória.

Outra coisa que você deve fazer é, quando o usuário abre um arquivo, carregá-lo, e interceptar qualquer OutOfMemoryError, então (como não é possível abrir o arquivo) fechar esse arquivo, limpar seus objetos e avisar o usuário que ele deve fechar arquivos não utilizados.

A sua ideia de expandir dinamicamente a memória virtual não resolve o problema, pois a máquina está limitada em recursos, por isso deve ter cuidado e lidar com problemas de memória (ou, pelo menos, ter cuidado com eles).

Algumas dicas que vi com fugas de memória são:

-- > Tenha em mente que se colocar algo numa colecção e depois esqueça isso, você ainda tem uma forte referência a ele, então anular a coleção, limpá-lo ou fazer algo com ele... se não você vai encontrar uma fuga de memória difícil de encontrar.

--> talvez, usando colecções com referências fracas (weakhashmap...) pode ajudar com problemas de memória, mas você deve {[15] } ser cuidadoso com ele, pois você pode descobrir que o objeto que você procura foi coletado.

Outra ideia que encontrei foi desenvolver uma colecção persistente que armazenado nos objectos da base de dados menos utilizados e carregados de forma transparente. Esta seria provavelmente a melhor abordagem...
 0
Author: SoulWanderer, 2010-09-29 07:47:13
Em relação ao netbeans, você poderia definir o tamanho máximo do heap para resolver o problema. Em primeiro lugar, vá para 'Run', depois --> 'Set Project Configuration' --> 'Customise' --> 'run' da sua janela aberta --> 'VM Option' --> preencha '-Xms2048m-Xmx2048m'.
 0
Author: Xiaogang, 2017-06-12 22:56:06

Se este problema estiver a acontecer no Wildfly 8 e no JDK1. 8, então precisamos de especificar a configuração do MaxMetaSpace em vez da configuração do PermGen.

Por exemplo, precisamos adicionar abaixo a configuração em setenv.sh ficheiro do wildfly. JAVA_OPTS="$JAVA_OPTS -XX:MaxMetaspaceSize=256M"

Para mais informações, por favor verifique o problema do heap do Wildfly

 0
Author: satish, 2017-08-28 05:10:30