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

Estou recebendo o seguinte erro na execução de um programa multi-threading

java.lang.OutOfMemoryError: Java heap space 

O erro acima ocorreu em um dos segmentos.

  1. Até onde sei, o espaço de heap é ocupado apenas por variables ​​de instância. Se isso estiver correto, então por que esse erro ocorreu após a execução correta por algum tempo, já que o espaço para variables ​​de instância é alocado no momento da criação do object.

  2. Existe alguma maneira de aumentar o espaço de heap?

  3. Quais alterações devo fazer no meu programa para que ele ocupe menos espaço de heap?

Se você quiser aumentar seu espaço de heap, poderá usar java -Xms -Xmx na linha de comandos. Por padrão, os valores são baseados na versão do JRE e na configuração do sistema. Você pode descobrir mais sobre as opções de VM no site do Java .

No entanto, eu recomendaria a criação de perfil do seu aplicativo para descobrir por que seu tamanho de heap está sendo comido. O NetBeans tem um profiler muito bom incluído. Eu acredito que usa o jvisualvm sob o capô. Com um profiler, você pode tentar encontrar onde muitos objects estão sendo criados, quando os objects são coletados como lixo e muito mais.

1.- Sim, mas basicamente se refere a toda a memory usada pelo seu programa.

2.- Sim, veja as opções do Java VM

 -Xms set initial Java heap size -Xmx set maximum Java heap size 

Ou seja

java -Xmx2g atribui 2 gigabytes de java -Xmx2g RAM como máximo ao seu aplicativo

Mas você deve ver se você não tem um memory leaks primeiro.

3.- Depende do programa. Tente vazamentos de memory. Esta questão seria difícil de responder. Ultimamente você pode criar perfis usando o JConsole para tentar descobrir onde sua memory está indo

Você pode querer olhar para este site para saber mais sobre a memory na JVM: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage

Eu achei útil usar o visualgc para observar como as diferentes partes do modelo de memory estão se enchendo, para determinar o que mudar.

É difícil determinar qual parte da memory foi preenchida, portanto, visualgc, como você pode querer apenas mudar a parte que está tendo um problema, ao invés de apenas dizer,

Bem! Eu vou dar 1G de RAM para a JVM.

Tente ser mais preciso sobre o que você está fazendo, a longo prazo você provavelmente achará o programa melhor para ele.

Para determinar onde o memory leaks pode ser, você pode usar testes unitários para isso, testando qual era a memory antes do teste, e depois, e se há uma mudança muito grande, então você pode querer examiná-la, mas você precisa faça a verificação enquanto seu teste ainda estiver em execução.

Para aumentar o tamanho do heap, você pode usar o argumento -Xmx ao iniciar o Java; por exemplo

 -Xmx256M 

Você pode obter o tamanho da memory de heap através do programe.

 public class GetHeapSize { public static void main(String[] args) { long heapsize = Runtime.getRuntime().totalMemory(); System.out.println("heapsize is :: " + heapsize); } } 

Em seguida, você pode aumentar o tamanho de heap também usando: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

  1. Na maioria dos casos, o código não é otimizado. Solte os objects que você acha que não serão mais necessários. Evite a criação de objects em seu loop a cada vez. Tente usar caches. Não sei como está sua aplicação. Mas na programação, uma regra da vida normal se aplica também

    Prevenção é melhor que a cura. “Não crie objects desnecessários”

  1. Até onde sei, o espaço de heap é ocupado apenas por variables ​​de instância. Se isso estiver correto, então por que esse erro ocorreu após a execução correta por algum tempo, já que o espaço para variables ​​de instância é alocado no momento da criação do object.

Isso significa que você está criando mais objects em seu aplicativo durante um período de tempo continuamente. Novos objects serão armazenados na memory heap e essa é a razão para o crescimento na memory heap.

O heap não contém apenas variables ​​de instância. Ele armazenará todos os tipos de dados não primitivos (Objetos). A vida útil desses objects pode ser curta (bloco de método) ou longa (até que o object seja referenciado em sua aplicação)

  1. Existe alguma maneira de aumentar o espaço de heap?

Sim. Dê uma olhada neste artigo oracle para mais detalhes.

Existem dois parâmetros para definir o tamanho da pilha:

-Xms:, que define o tamanho de heap inicial e mínimo

-Xmx:, que define o tamanho máximo do heap

  1. Quais alterações devo fazer no meu programa para que ele ocupe menos espaço de heap?

Depende do seu aplicativo.

  1. Configure a memory máxima do heap conforme o requisito do seu aplicativo

  2. Não cause vazamentos de memory em seu aplicativo

  3. Se você encontrar vazamentos de memory em seu aplicativo, encontre a causa raiz com a ajuda de ferramentas de criação de perfil, como MAT , Visual VM , jconsole etc. Depois de encontrar a causa raiz, corrija os vazamentos.

Notas importantes do artigo oracle

Explicação: A mensagem de detalhes O espaço de heap Java indica que o object não pôde ser alocado no heap Java. Esse erro não implica necessariamente um memory leaks.

Razões possíveis:

  1. Configuração incorreta (não alocar memory suficiente)
  2. O aplicativo está, sem querer, mantendo referências a objects e isso impede que os objects sejam coletados como lixo
  3. Aplicativos que fazem uso excessivo de finalizadores. Se uma class tiver um método finalize, os objects desse tipo não terão seu espaço recuperado no momento da garbage collection. Se o encadeamento do finalizador não puder acompanhar, com a fila de finalização, o heap Java poderá ser preenchido e esse tipo de exceção OutOfMemoryError será lançado .

Em uma nota diferente, use melhores algoritmos de garbage collection ( CMS ou G1GC )

Dê uma olhada nesta questão para entender o G1GC

  1. Variáveis ​​locais estão localizadas na pilha. O espaço de heap é ocupado por objects.

  2. Você pode usar a opção -Xmx .

  3. Basicamente, o espaço de heap é usado toda vez que você aloca um novo object com new e libera algum tempo depois que o object não é mais referenciado. Portanto, certifique-se de não manter referências a objects que não são mais necessários.

Não, acho que você está pensando em espaço de pilha. O espaço de heap é ocupado por objects. A maneira de aumentá-lo é -Xmx256m, substituindo o 256 pela quantidade necessária na linha de comando.

No netbeans, vá para a barra de ferramentas ‘Executar’, -> ‘Definir configuração do projeto’ -> ‘Personalizar’ -> ‘executar’ o seu windo -> ‘Opção VM’ -> preencher ‘-Xms2048m -Xmx2048m ‘. Isso poderia resolver o problema do tamanho de heap.