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 tópicos.
Até onde sei, o espaço Heap é ocupado apenas por variáveis de instância. Se isso estiver correto, então por que esse erro ocorreu após funcionar bem por algum tempo, já que o espaço para variáveis de instância são alocados no momento da criação do objeto.
Existe alguma maneira de aumentar o espaço de heap?
Que alterações devo fazer em meu programa para que ocupe menos espaço de heap?
java
multithreading
out-of-memory
heap-memory
Yatendra Goel
fonte
fonte
Respostas:
Se você deseja aumentar seu espaço de heap, você pode usar
java -Xms<initial heap size> -Xmx<maximum heap size>
na linha de comando. Por padrão, os valores são baseados na versão 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 criar o perfil de seu aplicativo para descobrir por que o tamanho do heap está sendo consumido. O NetBeans tem um profiler muito bom incluído com ele. Eu acredito que usa o
jvisualvm
sob o capô. Com um criador de perfil, você pode tentar descobrir onde muitos objetos estão sendo criados, quando os objetos são coletados pelo lixo e muito mais.fonte
1.- Sim, mas se refere basicamente a toda a memória utilizada pelo seu programa.
2.- Sim veja as opções Java VM
Ie
java -Xmx2g
atribua 2 gigabytes de RAM no máximo para seu aplicativoMas primeiro você deve verificar se não há vazamento de memória.
3.- Depende do programa. Tente detectar vazamentos de memória. Esta pergunta seria muito difícil de responder. Ultimamente, você pode criar perfis usando JConsole para tentar descobrir para onde sua memória está indo
fonte
Você pode querer dar uma olhada neste site para aprender mais sobre memória na JVM: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage
Achei útil usar o visualgc para observar como as diferentes partes do modelo de memória estão sendo preenchidas, para determinar o que mudar.
É difícil determinar qual parte da memória foi preenchida, portanto visualgc, pois você pode querer apenas alterar a parte que está com problema, em vez de apenas dizer:
Tente ser mais preciso sobre o que está fazendo; com o tempo, provavelmente encontrará o programa melhor para isso.
Para determinar onde pode estar o vazamento de memória, você pode usar testes de unidade para isso, testando qual era a memória antes do teste e depois, e se houver uma mudança muito grande, você pode querer examiná-la, mas, você precisa faça a verificação enquanto o teste ainda está em execução.
fonte
Para aumentar o tamanho do heap, você pode usar o argumento -Xmx ao iniciar o Java; por exemplo
fonte
Você pode obter o tamanho da memória heap por meio do programa abaixo.
então você também pode aumentar o tamanho do heap usando: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
fonte
Isso significa que você está criando mais objetos em seu aplicativo ao longo de um período de tempo continuamente. Novos objetos serão armazenados na memória heap e essa é a razão para o crescimento da memória heap.
Heap não contém apenas variáveis de instância. Ele armazenará todos os tipos de dados não primitivos (Objetos). A vida útil desses objetos pode ser curta (bloco de método) ou longa (até que o objeto seja referenciado em seu aplicativo)
Sim. Dê uma olhada neste artigo do oracle para mais detalhes.
Existem dois parâmetros para definir o tamanho do heap:
-Xms:, que define o tamanho de heap inicial e mínimo
-Xmx:, que define o tamanho máximo de heap
Depende da sua aplicação.
Defina a memória heap máxima de acordo com os requisitos do seu aplicativo
Não cause vazamentos de memória em seu aplicativo
Se você encontrar vazamentos de memória em seu aplicativo, encontre a causa raiz com a ajuda de ferramentas de perfil como MAT , Visual VM , jconsole etc. Depois de encontrar a causa raiz, corrija os vazamentos.
Notas importantes do artigo oracle
Razões possíveis:
Por outro lado, use algoritmos de coleta de lixo melhores ( CMS ou G1GC )
Dê uma olhada nesta questão para entender G1GC
fonte
Na maioria dos casos, o código não é otimizado. Libere aqueles objetos que você acha que não serão mais necessários. Evite a criação de objetos em seu loop todas as vezes. Tente usar caches. Não sei como está o seu aplicativo. Mas na programação, uma regra de vida normal também se aplica
Prevenção é melhor que a cura. "Não crie objetos desnecessários"
fonte
As variáveis locais estão localizadas na pilha. O espaço da pilha é ocupado por objetos.
Você pode usar a
-Xmx
opção.Basicamente, o espaço de heap é usado toda vez que você aloca um novo objeto
new
e é liberado algum tempo depois que o objeto não é mais referenciado. Portanto, certifique-se de não manter referências a objetos de que não precisa mais.fonte
Não, acho que você está pensando em espaço de pilha. O espaço da pilha é ocupado por objetos. A maneira de aumentá-lo é -Xmx256m, substituindo o 256 pela quantidade necessária na linha de comando.
fonte
Para evitar essa exceção, se você estiver usando JUnit e Spring, tente adicioná-lo em cada classe de teste:
fonte
No netbeans, vá para a barra de ferramentas 'Executar', -> 'Definir configuração do projeto' -> 'Personalizar' -> 'executar' da janela pop-up -> 'Opção VM' -> preencher '-Xms2048m -Xmx2048m '. Isso poderia resolver o problema do tamanho do heap.
fonte