Duffymo har nästan säkert rätt. Tidigare när vi har haft minnesläckor är det praktiskt taget ALLTID MySQL JDBC-drivrutinen. Bara att glömma att stänga en liten ResultSet eller Connection eller Statement någonstans. Det slutade med att jag granskade hela kodbasen för varje gång vi använde dem för att hitta problemet och säkerställa att de stängs.
När det gäller HashMap, jag har sett det också. Jag har inte tittat på källan men mitt intryck var att MySQL-drivrutinen lagrade raderna (åtminstone radvärden) i HashMaps internt.
Att läcka ResultSets är tyvärr lätt. Tanken på att de stängbara resurserna som sköter detta själva kommer i JDK 7 eller 8 tilltalar mig verkligen av denna anledning.
Du kan infoga en shim-klass någonstans (säg för Connection) för att logga varje öppnad/stängd resurs för att se om du kan fånga var läckan är utan att direkt läsa alla dina källor.