Дъфимо почти сигурно е прав. В миналото, когато сме имали течове на памет, това практически ВИНАГИ е драйверът на MySQL JDBC. Просто забравих да затвориш един малък ResultSet или връзка или изявление някъде. В крайна сметка проверявах цялата кодова база всеки път, когато ги използвахме, за да открием проблема и да гарантираме, че ще бъдат затворени.
Що се отнася до HashMap, аз също съм виждал това. Не съм гледал източника, но впечатлението ми беше, че MySQL драйверът съхранява редовете (поне стойностите на редове) в HashMaps вътрешно.
Изтичането на ResultSets за съжаление е лесно. Идеята за тези затварящи се ресурси, които сами се грижат за това, идващи в JDK 7 или 8, наистина ме привлича поради тази причина.
Бихте могли да вмъкнете някъде shim клас (да речем за Connection), за да регистрирате всеки отворен/затворен ресурс, за да видите дали можете да уловите къде е течът, без директно да четете целия си източник.