Encontrar memory leaks não é uma tarefa fácil, mas das últimas vezes eu consegui encontrar alguns utilizando as seguintes ferramentas:
Eclipse Mat Show archive.org snapshot
JSTAT Show archive.org snapshot
JProfiler Show archive.org snapshot
Quando a memória está cheia e não libera, eu gero um dump da heap utilizando o jstat
jmap -dump:live,file=NOME_DUMP PID_PROCESSO
Depois abro esse dump no Mat para analisar
Obs.: Quando o dump é muito grande, precisamos aumentar a memória do Mat, porque senão ele não consegue ler o arquivo todo.
Para isso, edite a memória disponível para ele no arquivo MemoryAnalyzer.ini. No exemplo abaixo temos 5Gb para ele.
-vmargs
-Xmx5120m
No caso do JProfiler edite a memória disponível no arquivo bin/jprofiler.vmoptions
Extra
Primeira vez na luta contra Memory Leaks em Java? Inicie seus estudos com estas dicas: