O que é Out of Memory (OOM)?
sobes.tech IA
Resposta da IA
Out of Memory (OOM) — é uma situação em que uma aplicação ou sistema operativo esgota a memória RAM disponível para alocar novos objetos ou realizar operações necessárias.
No contexto de sistemas operativos, OOM ocorre quando o sistema não consegue alocar memória para um novo processo ou thread. Para evitar uma falha total do sistema, no Linux existe o OOM Killer, um mecanismo que termina processos que consomem muita memória para liberar recursos.
No contexto de aplicações, OOM ocorre quando a máquina virtual Java (JVM) ou outro ambiente de execução não consegue alocar memória no heap para criar um novo objeto.
As causas de OOM podem ser variadas:
- Fugas de memória: Objetos que já não são utilizados permanecem na memória porque há referências a eles, impedindo o garbage collector de os remover.
- Consumo excessivo de memória: A aplicação solicita ou mantém uma quantidade demasiado grande de memória para processar dados (por exemplo, carregar um ficheiro grande na memória).
- Alocação insuficiente de memória: As configurações da JVM (por exemplo,
-Xmx) ou do ambiente de execução não fornecem memória suficiente para a aplicação. - Configuração incorreta de pools de threads ou conexões: Um número excessivo de threads ou conexões ativas pode consumir quantidades significativas de memória de pilha (para threads) ou outras áreas de memória.
Os sinais de OOM ao nível da aplicação incluem:
- Lentidão na aplicação.
- Exceção
OutOfMemoryErrornos logs. - Queda do garbage collector.
Para diagnosticar OOM, utilizam-se abordagens como:
- Análise de logs: Procurar por exceções
OutOfMemoryErrore mensagens do OOM Killer. - Captura de dumps de heap: Criar uma imagem do conteúdo do heap no momento do erro para análise posterior com ferramentas como Eclipse Memory Analyzer Tool (MAT), VisualVM.
- Monitorização: Uso de sistemas de monitorização (Prometheus, Grafana, New Relic) para acompanhar o uso de memória da JVM e do sistema operativo.
- Perfilagem: Uso de perfis (JProfiler, YourKit) para identificar padrões de uso de memória e fontes de fugas.
// Exemplo de código Java que pode causar OOM (com fuga de memória)
import java.util.ArrayList;
import java.util.List;
public class OOMExample {
private List<Object> largeList = new ArrayList<>();
public void addObjects() {
while (true) {
largeList.add(new Object()); // Adiciona objetos continuamente sem removê-los
}
}
public static void main(String[] args) {
OOMExample example = new OOMExample();
example.addObjects();
}
}
# Exemplo de comando para executar Java com limite de memória para demonstração rápida de OOM
java -Xmx64m OOMExample
Prevenir OOM inclui:
- Otimizar o código para uso eficiente de memória.
- Configurar corretamente os parâmetros de memória da JVM ou do ambiente de execução.
- Analisar regularmente os dumps de heap e fazer perfilagem.
- Monitorar o uso de memória em produção.