- 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.
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)
- Existe alguma maneira de aumentar o espaço de heap?
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
- Que alterações devo fazer em meu programa para que ocupe menos espaço 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
Explicação: A mensagem detalhada do espaço de heap Java indica que o objeto não pôde ser alocado no heap Java. Esse erro não significa necessariamente um vazamento de memória.
Razões possíveis:
- Configuração inadequada (não alocação de memória suficiente)
- O aplicativo está retendo involuntariamente referências a objetos e isso impede que os objetos sejam coletados como lixo
- Aplicativos que fazem uso excessivo de finalizadores. Se uma classe tiver um método de finalização, os objetos desse tipo não terão seu espaço recuperado no momento da coleta de lixo. Se o encadeamento do finalizador não puder acompanhar, com a fila de finalização, o heap Java pode ser preenchido e esse tipo de exceção OutOfMemoryError seria lançado .
Por outro lado, use algoritmos de coleta de lixo melhores ( CMS ou G1GC )
Dê uma olhada nesta questão para entender G1GC