O que é Memory Leak em Java e como evitá-lo?

Memory Leak ocorre quando a memória alocada não é liberada corretamente, causando consumo excessivo de recursos e impactando o desempenho.

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.

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

Compartilhe este tutorial: O que é Memory Leak em Java e como evitá-lo

Compartilhe este tutorial

Continue aprendendo:

Como usar ThreadLocal para armazenar dados de forma isolada

ThreadLocal permite que cada thread tenha uma cópia isolada de um dado, evitando concorrência e melhorando o isolamento de informações.

Tutorial anterior

Como otimizar o consumo de memória e CPU em aplicações Java

A otimização do consumo de memória e CPU em Java melhora a eficiência da aplicação, reduzindo latência e melhorando a escalabilidade.

Próximo tutorial