Сами слушатели не создают утечку памяти. Однако они часто используются ненадлежащим образом и могут привести к утечкам. Иногда вы видите код, где объект ссылается на Компонент (например, для отображения там сообщений), у которого есть слушатель, который ссылается (возможно, косвенно) на первый объект. Это формирует цикл, и все его члены живут и умирают вместе. Когда Компонент является диалогом, который должен быть недолговечным, у вас могут возникнуть проблемы. Начинающие склонны использовать такие объекты, как
class MyKitchenSink implements Runnable, KeyListener, ....
, который может иметь много ссылок и облегчает утечку памяти *. Не создавать "универсальные классы" - это путь.
* Это не «настоящая» утечка памяти, как в C
, поскольку все объекты остаются доступными и могут быть использованы, если вы захотите. Это просто делает объект доступным гораздо дольше, чем ожидалось, что пожирает вашу память, как утечку.