O que é Memory Leak em Java e como evitá-lo?
Memory Leak ocorre quando um programa aloca memória que nunca é liberada, resultando em um aumento progressivo do consumo de RAM. Em Java, isso pode acontecer quando objetos inutilizados permanecem referenciados, impedindo que o Garbage Collector os remova.
1. Como Memory Leak acontece?
Memory Leak geralmente ocorre quando:
✔ Referências não são removidas corretamente.
✔ Objetos são armazenados em coleções estáticas.
✔ Listeners e callbacks não são descartados.
✔ Uso indevido de ThreadLocal
sem remove()
.
✔ Streams e conexões não são fechadas corretamente.
2. Exemplos de Memory Leak
2.1. Referência a objetos não utilizados
import java.util.ArrayList;
import java.util.List;
public class MemoryLeak {
private static List<Object> lista = new ArrayList<>();
public static void adicionarObjetos() {
for (int i = 0; i < 1_000_000; i++) {
lista.add(new Object()); // Objetos nunca são removidos
}
}
public static void main(String[] args) {
adicionarObjetos();
}
}
Problema: A lista cresce indefinidamente, pois os objetos nunca são removidos.
2.2. Uso indevido de ThreadLocal
public class ExemploThreadLocal {
private static final ThreadLocal<byte[]> threadLocal = new ThreadLocal<>();
public static void main(String[] args) {
threadLocal.set(new byte[1024 * 1024 * 10]); // Aloca 10MB na memória
// Esquecemos de remover a referência
}
}
Solução: Sempre chame
threadLocal.remove();
ao final do uso.
3. Como evitar Memory Leak?
✔️ 1. Remova referências desnecessárias
lista.clear(); // Remove todos os objetos armazenados
✔️ 2. Use WeakReferences para evitar objetos permanentes
Se um objeto pode ser descartado pelo Garbage Collector, use WeakReference
:
import java.lang.ref.WeakReference;
WeakReference<String> weakRef = new WeakReference<>(new String("Texto"));
✔️ 3. Sempre feche recursos
try (BufferedReader br = new BufferedReader(new FileReader("arquivo.txt"))) {
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
✔️ 4. Monitore uso de memória com VisualVM
O VisualVM (Download ) permite:
✔ Identificar objetos não liberados. ✔ Analisar uso de heap e threads. ✔ Detectar possíveis vazamentos de memória.
Conclusão
Memory Leak pode causar queda de performance e crashes. Evite-o liberando referências desnecessárias, utilizando WeakReference
e monitorando sua aplicação com ferramentas como VisualVM.
Como detectar e prevenir Memory Leak em Java?
Memory Leak é um dos problemas mais difíceis de detectar em aplicações Java, pois os sintomas podem aparecer apenas após longos períodos de execução. Monitorar o uso de heap e entender como o Garbage Collector trabalha são práticas essenciais para evitar esse tipo de falha.
Algumas aplicações:
- Evitar consumo excessivo de memória
- Melhorar a estabilidade da aplicação
- Prevenir travamentos causados por falta de recursos
- Manter a eficiência do Garbage Collector
Dicas para quem está começando
- Evite armazenar objetos em listas estáticas sem necessidade
- Feche recursos como arquivos e conexões de banco de dados
- Use
WeakReference
para objetos opcionais - Monitore sua aplicação com VisualVM
Contribuições de Rodrigo Farias