Só uma nota muito rápida a propósito de uma memory leak que tive que identificar recentemente.
Até encontrar esta situação, todos os casos com que me tinha deparado eram sempre causados por uma colecção static que não estava a ser devidamente mantida. Esta situação, é ligeiramente diferente, no sentido em que a colecção em causa não é mantida directamente pela aplicação, mas sim pelo SWT. É um problema conhecido como “Lapsed Listeners” e está bem descrito aqui:
http://www.javaworld.com/javaworld/javatips/jw-javatip79.html?page=1
Resumidamente: lembrem-se sempre de remover os listeners que já não são acessíveis, ou então implementem-nos com uma WeakReference.