Vazamento de memória - ArrayList

Estou com um problema muitíssimo chato de vazamento de memória.

Basicamente, meu sistema trabalha com muitos ArrayList. É dao retornando ArrayList, é TableModel exibindo ArrayList, É ArrayList de ArrayList… enfim. Pelo profiler do NetBeans, vejo que, ao executar uma função, o uso de memória não volta ao estágio anterior. Usando o jmap e jhat vejo que a classe que está “vazando” é justamente a classe usada como conteúdo do ArrayList. Só não consigo entender em que momento eu falhei! Sério, não consigo entender. Como esse sistema vem da época que eu comecei a aprender java, sinceramente não me preocupei muito em “limpar” variáveis e essas coisas.

Por exemplo: um dao retorna um array que é passado à um tableModel. Ótimo, adorei a idéia. Mas ele nunca é limpado da memória. Porque?

Gostaria de saber se alguém tem algumas dícas e “boas práticas” no uso de ArrayLists para compartilhar comigo, pra ver se tenho alguma luz!

Obrigado e até mais.

O TableModel está sendo referenciado pelo JTable que está sendo referenciado pelo JFrame, que não foi limpo da memória.

Pois é… tava desconfiando de algo parecido.

Mas porque o JFrame não foi limpo da memória? Uso o dispose() e depois seto-o para null.

Falta algum passo?

É justamente isso que é complicado. Não sei se pelo profiler se consegue determinar quem é que afinal de contas está referenciando esses objetos que não morrem.

Pelo jmap eu consigo ver que tanto o ArrayList quanto o TableModel e o próprio JFrame ainda estão na memória, mesmo depois de um GC. Aí que não consigo entender a coisa. Quem usa os dados do ArrayList é somente o TableModel. E não há listeners adicionados por mim. E porque diabos o Frame não morre? É um frame muito simples, não há edição nenhuma.